<html>
  <head>
    <title>
      HDF5 File Format Specification Version 3.0
    </title>

    <style>
      h1 {    display: block;
              margin-top: 24px;
              margin-bottom: 24px;
              margin-left: 0px;
              margin-right: 0px;
              text-indent: 0px;
              font-size: 300%;
         }

      h2 {    display: block;
              margin-top: 60px;
              margin-bottom: 8px;
              margin-left: 0px;
              margin-right: 0px;
              text-indent: 0px;
              border-style: solid;
              border-top-style: medium;
              border-top-color: #A9A9A9;
              border-bottom: none;
              border-left: none;
              border-right: none;
              font-size: 250%;
         }

      h3 {    display: block;
              margin-top: 40px;
              margin-bottom: 8px;
              margin-left: 0px;
              margin-right: 0px;
              text-indent: 0px;
              font-size: 200%;
         }

      h4 {    display: block;
              margin-top: 32px;
              margin-bottom: 8px;
              margin-left: 0px;
              margin-right: 0px;
              text-indent: 0px;
              font-size: 150%;
         }

      p { display: block;
          margin-top: 8px;
          margin-bottom: 8px;
          margin-left: 0px;
          margin-right: 0px;
          text-indent: 0px;
          font-size: 100%;
        }
      <!--
      p.item {    margin-left: 2em;
                  text-indent: -2em
             } -->
               <!-- p.item2 { margin-left: 2em; text-indent: 2em} -->

                                                                  table.format {  border:solid;
                                                                                  border-collapse:collapse;
                                                                                  caption-side:top;
                                                                                  text-align:center;
                                                                                  width:80%;
                                                                               }
      table.format th {   border:ridge;
                          padding:4px;
                          width:25%;
                      }
      table.format td {   border:ridge;
                          padding:4px;
                      }
      table.format caption {  font-weight:bold;
                              font-size:larger;
                           }

      table.note {border:none;
                  text-align:right;
                  width:80%;
                 }

      table.desc {    border:solid;
                      border-collapse:collapse;
                      caption-size:top;
                      text-align:left;
                      width:80%;
                 }
      table.desc tr { vertical-align:top;
                    }
      table.desc th { border-style:ridge;
                      font-size:larger;
                      padding:4px;
                      <!-- text-decoration:underline; -->
                    }
      table.desc td { border-style:ridge;
                      <!-- padding: 4px; -->
                                         vertical-align:text-top;
                    }
      table.desc caption {    font-weight:bold;
                              font-size:larger;
                         }

      table.list {    border:none;
                      width:100%
                 }
      table.list tr { vertical-align:text-top;
                    }
      table.list th { border:none;
                      text-decoration:underline;
                      vertical-align:text-top;
                    }
      table.list td { border:none;
                      vertical-align:text-top;
                    }

      table.msgdesc    {  border:none;
                          text-align:left;
                          width: 80%
                       }
      table.msgdesc tr {  vertical-align:text-top;
                          border-spacing:0;
                          padding:0; }
      table.msgdesc th {  border:none;
                          text-decoration:underline;
                          vertical-align:text-top; }
      table.msgdesc td {  border:none;
                          vertical-align:text-top;
                       }

      table.list80 {  border:none;
                      width:80%
                   }
      table.list80 tr {   vertical-align:text-top;
                      }
      table.list80 th {   border:none;
                          text-decoration:underline;
                          vertical-align:text-top;
                      }
      table.list80 td {   border:none;
                          vertical-align:text-top;
                      }

      table.glossary    { border:none;
                          text-align:left;
                          width: 80%
                        }
      table.glossary tr { vertical-align:text-top;
                          border-spacing:0;
                          padding:0; }
      table.glossary th { border:none;
                          text-align:left;
                          text-decoration:underline;
                          vertical-align:text-top; }
      table.glossary td { border:none;
                          text-align:left;
                          vertical-align:text-top;
                        }

      div {   page-break-inside:avoid;
              page-break-after:auto
          }

    </style>

    <!-- #BeginLibraryItem "/ed_libs/styles_Format.lbi" -->
    <!--
        * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        * Copyright by The HDF Group.                                               *
        * All rights reserved.                                                      *
        *                                                                           *
        * This file is part of HDF5.  The full HDF5 copyright notice, including     *
        * terms governing use, modification, and redistribution, is contained in    *
        * the COPYING file, which can be found at the root of the source code       *
        * distribution tree, or in https://www.hdfgroup.org/licenses.               *
        * If you do not have access to either file, you may request a copy from     *
        * help@hdfgroup.org.                                                        *
        * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
      -->
    <!-- #EndLibraryItem --><!-- #BeginLibraryItem "/ed_libs/NavBar_ADevG.lbi" -->
  </head>
  <body>
    <!-- #EndLibraryItem -->

    <center>
      <table border="0" width="90%">
        <tr>
          <td valign="top">
            <ol type="I">
              <li><a href="#Intro">Introduction</a></li>
              <font size="-1">
                <ol type="A">
                  <li><a href="#ThisDocument">This Document</a></li>
                  <li><a href="#ChangesForHdf5_1_12">Changes for HDF5 1.12</a></li>
                  <li><a href="#ChangesForHdf5_1_10">Changes for HDF5 1.10</a></li>
                </ol>
              </font>

              <li><a href="#FileMetaData">Disk Format: Level 0 - File Metadata</a></li>
              <font size="-1">
	            <ol type="A">
	              <li><a href="#Superblock">Disk Format: Level 0A - Format Signature
                      and Superblock</a></li>
	              <li><a href="#DriverInfo">Disk Format: Level 0B - File Driver
                      Info</a></li>
	              <li><a href="#SuperblockExt">Disk Format: Level 0C - Superblock
                      Extension</a></li>
	            </ol>
              </font>
              <li><a href="#FileInfra">Disk Format: Level 1 - File Infrastructure</a></li>
              <font size="-1">
	            <ol type="A">
	              <li><a href="#Btrees">Disk Format: Level 1A - B-trees and B-tree
                      Nodes</a>
	                <ol type="1">
                      <li><a href="#V1Btrees">Disk Format: Level 1A1 - Version 1
                          B-trees</a></li>
                      <li><a href="#V2Btrees">Disk Format: Level 1A2 - Version 2
                          B-trees</a></li>
                    </ol>
                  </li>
	              <li><a href="#SymbolTable">Disk Format: Level 1B - Group Symbol
                      Table Nodes</a></li>
	              <li><a href="#SymbolTableEntry">Disk Format: Level 1C - Symbol
                      Table Entry</a></li>
	              <li><a href="#LocalHeap">Disk Format: Level 1D - Local Heaps</a></li>
	              <li><a href="#GlobalHeap">Disk Format: Level 1E - Global Heap</a></li>
                  <li><a href="#GlobalHeapVDS">Disk Format: Level 1F - Global Heap
                      Block for Virtual Datasets</a></li>
	              <li><a href="#FractalHeap">Disk Format: Level 1G - Fractal Heap</a></li>
	              <li><a href="#FreeSpaceManager">Disk Format: Level 1H - Free-space
                      Manager</a></li>
	              <li><a href="#SOHMTable">Disk Format: Level 1I - Shared Object
                      Header Message Table</a></li>
	            </ol>
              </font>
              <li><a href="#DataObject">Disk Format: Level 2 - Data Objects</a></li>
              <font size="-1">
	            <ol type="A">
	              <li><a href="#ObjectHeader">Disk Format: Level 2A - Data Object Headers</a></li>
                  <ol type="1">
                    <li><a href="#ObjectHeaderPrefix">Disk Format: Level 2A1 -
                        Data Object Header Prefix</a>
                      <ol type="a">
                        <li><a href="#V1ObjectHeaderPrefix">Version 1 Data
                            Object Header Prefix</a></li>
                        <li><a href="#V2ObjectHeaderPrefix">Version 2 Data
                            Object Header Prefix</a></li>
                      </ol>
                    </li>
                    <li><a href="#ObjectHeaderMessages">Disk Format: Level 2A2 -
                        Data Object Header Messages</a></li>
                    <ol type="a">
                      <li><a href="#NILMessage">The NIL Message</a></li>                                                       <!-- 0x0000 -->
                      <li><a href="#DataspaceMessage">The Dataspace Message</a></li>                                           <!-- 0x0001 -->
                      <li><a href="#LinkInfoMessage">The Link Info Message</a></li>                                     	  <!-- 0x0002 -->
                      <li><a href="#DatatypeMessage">The Datatype Message</a></li>                                             <!-- 0x0003 -->
                      <li><a href="#OldFillValueMessage">The Data Storage -
                          Fill Value (Old) Message</a></li>        <!-- 0x0004 -->
                    </ol>
                  </ol>
                </ol>
              </font>
            </ol>
          </td>

          <td>&nbsp;</td>

          <td valign="top">
            <ol type="I" start="4">
              <li><a href="#DataObject">Disk Format: Level 2 - Data
                  Objects</a><font size="-1"><i> (Continued)</i></li>
	          <ol type="A">
	            <li><a href="#ObjectHeader">Disk Format: Level 2A - Data Object
                    Headers</a><i> (Continued)</i>
	              <ol type="1" start="2">
                    <li><a href="#ObjectHeaderMessages">Disk Format: Level 2A2 -
                        Data Object Header Messages</a><i> (Continued)</i></li>
                    <ol type="a" start="6">
                      <li><a href="#FillValueMessage">The Data Storage -
                          Fill Value Message</a></li>              <!-- 0x0005 -->
                      <li><a href="#LinkMessage">The Link Message</a></li>                                             <!-- 0x0006 -->
                      <li><a href="#ExternalFileListMessage">The Data Storage -
                          External Data Files Message</a></li>     <!-- 0x0007 -->
                      <li><a href="#LayoutMessage">The Data Layout Message</a></li>                                  <!-- 0x0008 -->
                      <li><a href="#BogusMessage">The Bogus Message</a></li>                                                   <!-- 0x0009 -->
                      <li><a href="#GroupInfoMessage">The Group Info
                          Message</a></li>                         <!-- 0x000a -->
                      <li><a href="#FilterMessage">The Data Storage -
                          Filter Pipeline Message</a></li>         <!-- 0x000b -->
                      <li><a href="#AttributeMessage">The Attribute
                          Message</a></li>                         <!-- 0x000c -->
                      <li><a href="#CommentMessage">The Object Comment
                          Message</a></li>                         <!-- 0x000d -->
                      <li><a href="#OldModificationTimeMessage">The Object
                          Modification Time (Old) Message</a></li> <!-- 0x000e -->
                      <li><a href="#SOHMTableMessage">The Shared Message
                          Table Message</a></li>                   <!-- 0x000f -->
                      <li><a href="#ContinuationMessage">The Object Header
                          Continuation Message</a></li>            <!-- 0x0010 -->
                      <li><a href="#SymbolTableMessage">The Symbol
                          Table Message</a></li>                   <!-- 0x0011 -->
                      <li><a href="#ModificationTimeMessage">The Object
                          Modification Time Message</a></li>       <!-- 0x0012 -->
                      <li><a href="#BtreeKValuesMessage">The B-tree
                          &lsquo;K&rsquo; Values Message</a></li>  <!-- 0x0013 -->
                      <li><a href="#DrvInfoMessage">The Driver Info
                          Message</a></li>                         <!-- 0x0014 -->
                      <li><a href="#AinfoMessage">The Attribute Info
                          Message</a></li>                         <!-- 0x0015 -->
                      <li><a href="#RefCountMessage">The Object Reference
                          Count Message</a></li>                   <!-- 0x0016 -->
                      <li><a href="#FsinfoMessage">The File Space Info
                          Message</a></li>                         <!-- 0x0017 -->
                    </ol>
	              </ol>
                </li>
	            <li><a href="#DataStorage">Disk Format: Level 2B - Data Object Data Storage</a></li>
	          </ol>
              </font>
              <li><a href="#AppendixA">Appendix A: Definitions</a></li>
              <li><a href="#AppendixB">Appendix B: File Space Allocation
                  Types</a></li>
              <li><a href="#AppendixC">
                  Appendix C: Types of Indexes for Dataset Chunks</a></li>
              <font size="-1">
	            <ol type="A">
	              <li><a href="#SingleChunk">The Single Chunk Index</a></li>
	              <li><a href="#Implicit">The Implicit Index</a></li>
	              <li><a href="#FixedArray">The Fixed Array Index</a></li>
	              <li><a href="#ExtensibleArray">The Extensible Array Index</a></li>
	              <li><a href="#AppendV2Btrees">The Version 2 B-trees Index</a></li>
	            </ol>
              </font>
              <li><a href="#AppendixD">
                  Appendix D: Encoding for Dataspace and Reference</a></li>
              <font size="-1">
	            <ol type="A">
	              <li><a href="#DataspaceEncode">Dataspace Encoding</a></li>
	              <li><a href="#ReferenceEncodeRV">Reference Encoding (Revised)</a></li>
	              <li><a href="#ReferenceEncodeDP">Reference Encoding (Backward Compatibility)</a></li>
	            </ol>
              </font>
            </ol>
        </td></tr>
      </table>
    </center>


    <a name="Intro"><h2>I. Introduction</h2></a>

    <table align="right" width="100">
      <tr><td>&nbsp;</td><td align="center">
          <hr />
          <img src="FF-IH_FileGroup.gif" alt="HDF5 Groups" hspace="15" vspace="15">
        </td><td>&nbsp;</td></tr>
      <tr><td>&nbsp;</td><td align="center">
          <strong>Figure 1:</strong> Relationships among the HDF5 root group, other groups, and objects
          <hr />
        </td><td>&nbsp;</td></tr>

      <tr><td>&nbsp;</td><td align="center">
          <img src="FF-IH_FileObject.gif" alt="HDF5 Objects" hspace="15" vspace="15">
        </td><td>&nbsp;</td></tr>
      <tr><td>&nbsp;</td><td align="center">
          <strong>Figure 2:</strong> HDF5 objects -- datasets, datatypes, or dataspaces
          <hr />
        </td><td>&nbsp;</td></tr>
    </table>


    <p>The format of an HDF5 file on disk encompasses several
      key ideas of the HDF4 and AIO file formats as well as
      addressing some shortcomings therein.  The new format is
      more self-describing than the HDF4 format and is more
      uniformly applied to data objects in the file.</p>

    <p>An HDF5 file appears to the user as a directed graph.
      The nodes of this graph are the higher-level HDF5 objects
      that are exposed by the HDF5 APIs:</p>

    <ul>
      <li>Groups</li>
      <li>Datasets</li>
      <li>Committed (formerly Named) datatypes</li>
    </ul>

    <p>At the lowest level, as information is actually written to the disk,
      an HDF5 file is made up of the following objects:</p>
    <ul>
      <li>A superblock</li>
      <li>B-tree nodes</li>
      <li>Heap blocks</li>
      <li>Object headers</li>
      <li>Object data</li>
      <li>Free space</li>
    </ul>

    <p>The HDF5 Library uses these low-level objects to represent the
      higher-level objects that are then presented to the user or
      to applications through the APIs. For instance, a group is an
      object header that contains a message that points to a local
      heap (for storing the links to objects in the group) and to a
      B-tree (which indexes the links). A dataset is an object header
      that contains messages that describe the datatype, dataspace,
      layout, filters, external files, fill value, and other elements
      with the layout message pointing to either a raw data chunk or
      to a B-tree that points to raw data chunks.</p>


    <a name="ThisDocument"><h3>I.A. This Document</h3></a>

    <p>This document describes the lower-level data objects;
      the higher-level objects and their properties are described
      in the <a href="UG/HDF5_User_Guide-Responsive HTML5/index.html"><cite>HDF5 User Guide</cite></a>.</p>

    <p>Three levels of information comprise the file format.
      Level 0 contains basic information for identifying and
      defining information about the file.  Level 1 information contains
      the information about the pieces of a file shared by many objects
      in the file (such as B-trees and heaps).  Level 2 is the rest
      of the file and contains all of the data objects with each object
      partitioned into header information, also known as
      <em>metadata</em>, and data.</p>

    <p>The various components of the lower-level data objects are
      described in pairs of tables. The first table shows the format
      layout, and the second table describes the fields. The titles
      of format layout tables begin with &ldquo;Layout&rdquo;. The
      titles of the tables where the fields are described begin with
      &ldquo;Fields&rdquo;. For example, the table that describes the
      format of the <a href="#V2Btrees">version 2 B-tree header</a> has
      a title of &ldquo;Layout: Version 2 B-tree Header&rdquo;, and the
      fields in the version 2 B-tree header are described in the table
      titled &ldquo;Fields: Version 2 B-tree Header&rdquo;.

    <p>The sizes of various fields in the following layout tables are
      determined by looking at the number of columns the field spans
      in the table.  There are exceptions: </p>
    <ul>
      <li> The size may be overridden by specifying a size in
        parentheses</li>
      <li> The size of addresses is determined by the
        <em><a href="#SizeOfOffsetsV0">Size of Offsets</a></em> field
        in the superblock and is indicated in this document with a
        superscripted &lsquo;O&rsquo;</li>
      <li> The size of length fields is determined by the
        <em><a href="#SizeOfLengthsV0">Size of Lengths</a></em> field in
        the superblock and is indicated in this document with a
        superscripted &lsquo;L&rsquo;</li>
    </ul>

    <p>Values for all fields in this document should be treated as unsigned
      integers, unless otherwise noted in the description of a field.
      Additionally, all metadata fields are stored in little-endian byte
      order.
    </p>

    <p>All checksums used in the format are computed with the
      <a href="http://www.burtleburtle.net/bob/hash/doobs.html">Jenkins&rsquo;
        lookup3</a> algorithm.
    </p>

    <p>Whenever a bit flag or field is mentioned for an entry, bits are
      numbered from the lowest bit position in the entry.
    </p>

    <p>Various format tables in this document have cells with
      &ldquo;This space inserted only to align table nicely&rdquo;. These
      entries in the table are just to make the table presentation nicer
      and do not represent any values or padding in the file.
    </p>

    <a name="ChangesForHdf5_1_12">
      <h3>I.B. Changes for HDF5 1.12</h3></a>
    <p>The following sections have been
      changed or added for the 1.12 release:</p>
    <ul>
      <li>Under <a href="#DatatypeMessage">&ldquo;The Datatype Message&rdquo;</a>,
        in the Description for &ldquo;Fields:Datatype Message&rdquo;,
        version 4 was added and Reference class (7) of the datatype was updated to describe version 4.</li>
      <li><a href="#AppendixD">
          &ldquo;Appendix D: Encoding for Dataspace and Reference&rdquo;</a>
        was added. </li>
    </ul>


    <a name="ChangesForHdf5_1_10">
      <h3>I.C. Changes for HDF5 1.10</h3></a>

    <p>The following sections have been
      changed or added for the 1.10 release:</p>
    <ul>
      <li>In the <a href="#Superblock">
          &ldquo;Disk Format: Level 0A - Format Signature and
          Superblock&rdquo;</a> section, version 3 of the superblock was
        added. </li>
      <li>In the <a href="#SuperblockExt">
          &ldquo;Disk Format: Level 0C - Superblock Extension&rdquo;</a>
        section, a link to the Data Storage message was added. </li>
      <li>In the <a href="#V2Btrees">
          &ldquo;Disk Format: Level 1A2 - Version 2 B-trees&rdquo;</a>
        section, additional B-tree types were added. Tables that
        describe the <a href="#V2BtreesType10">type 10</a> and
        <a href="#V2BtreesType11">11</a> record layouts were added at
        the end of the section.</li>
      <li>The <a href="#GlobalHeapVDS">&ldquo;Disk Format: Level 1F -
          Global Heap Block for Virtual Datasets&rdquo;</a> was added.
      </li>
      <li><a href="#LayoutMessage">
          &ldquo;The Data Layout Message&rdquo;</a> section was changed.
        The name was changed, and <a href="#DataLayoutV4">version 4</a>
        of the data layout message was added for the virtual type.</li>
      <li>The <a href="#FsinfoMessage">
          &ldquo;The File Space Info Message&rdquo;</a> header message
        type was added.</li>
      <li><a href="#AppendixC">
          &ldquo;Appendix C: Types of Indexes for Dataset Chunks&rdquo;</a>
        was added. Five indexing types were added.</li>
    </ul>



    <h2><a name="FileMetaData">
        II. Disk Format: Level 0 - File Metadata</a></h2>



    <h3><a name="Superblock">
        II.A. Disk Format: Level 0A - Format Signature and Superblock</a></h3>

    <p>The superblock may begin at certain predefined offsets within
      the HDF5 file, allowing a block of unspecified content for
      users to place additional information at the beginning (and
      end) of the HDF5 file without limiting the HDF5 Library&rsquo;s
      ability to manage the objects within the file itself.  This
      feature was designed to accommodate wrapping an HDF5 file in
      another file format or adding descriptive information to an HDF5
      file without requiring the modification of the actual file&rsquo;s
      information.  The superblock is located by searching for the
      HDF5 format signature at byte offset 0, byte offset 512, and at
      successive locations in the file, each a multiple of two of
      the previous location; in other words, at these byte offsets:
      0, 512, 1024, 2048, and so on.</p>

    <p>The superblock is composed of the format signature, followed by a
      superblock version number and information that is specific to each
      version of the superblock.

    <p>Currently, there are four versions of the superblock format:
      <ul>
        <li>Version 0 is the default format.</li>
        <li>Version 1 is the same as version 0 but with the
          &ldquo;<em>Indexed Storage Internal Node K</em>&rdquo; field
          for storing non-default B-tree &lsquo;K&rsquo; value.</li>
        <li>Version 2 has some fields eliminated and compressed from
          superblock format versions 0 and 1. It has added checksum support
          and superblock extension to store additional superblock
          metadata.</li>
        <li>Version 3 is the same as version 2 except that the field
          &ldquo;<em>File Consistency Flags</em>&rdquo; is used for file
          locking. This format version will enable support for the latest
          version.</li>
      </ul>

    <p>Versions 0 and 1 of the superblock are described below:</p>


    <div align="center">
      <table class="format">
        <caption>
          Layout: Superblock (Versions 0 and 1)
        </caption>

	    <tr>
	      <th>byte</th>
	      <th>byte</th>
	      <th>byte</th>
	      <th>byte</th>
	    </tr>

	    <tr>
	      <td colspan="4"><br />Format Signature
            <em>(8 bytes)</em><br /><br /></td>
	    </tr>

	    <tr>
	      <td>Version # of Superblock</td>
	      <td>Version # of File&rsquo;s Free Space Storage</td>
	      <td>Version # of Root Group Symbol Table Entry</td>
	      <td>Reserved <em>(zero)</em></td>
	    </tr>

	    <tr>
	      <td>Version Number of Shared Header Message Format</td>
	      <td>Size of Offsets</td>
	      <td>Size of Lengths</td>
	      <td>Reserved <em>(zero)</em></td>
	    </tr>

	    <tr>
	      <td colspan="2">Group Leaf Node K</td>
	      <td colspan="2">Group Internal Node K</td>
	    </tr>

	    <tr>
	      <td colspan="4">File Consistency Flags</td>
	    </tr>

	    <tr>
	      <td colspan="2" style="border:dotted;">Indexed Storage Internal Node K<sup>1</sup></td>
	      <td colspan="2" style="border:dotted;">Reserved
            <em>(zero)</em><sup>1</sup></td>
	    </tr>

	    <tr>
	      <td colspan="4"><br />Base Address<sup>O</sup><br /><br /></td>
	    </tr>

	    <tr>
	      <td colspan="4"><br />Address of File Free space Info<sup>O</sup><br /><br /></td>
	    </tr>

	    <tr>
	      <td colspan="4"><br />End of File Address<sup>O</sup><br /><br /></td>
	    </tr>

	    <tr>
	      <td colspan="4"><br />Driver Information Block Address<sup>O</sup><br /><br /></td>
	    </tr>

	    <tr>
	      <td colspan="4">Root Group Symbol Table Entry</td>
	    </tr>
      </table>

      <table class="note">
        <tr>
          <td width="60%">&nbsp;</td>
          <td width="40%">
            (Items marked with a &lsquo;1&rsquo; in the above table are
            new in version 1 of the superblock.)
        </td></tr>
        <tr>
          <td>&nbsp;</td>
          <td>
            (Items marked with an &lsquo;O&rsquo; in the above table are
            of the size specified in the <a href="#SizeOfOffsetsV0">Size
              of Offsets</a> field in the superblock.)
        </td></tr>
      </table>
    </div>

    <br />
    <div align="center">
      <table class="desc">
        <caption>
          Fields: Superblock (Versions 0 and 1)
        </caption>
	    <tr>
          <th width="30%">Field Name</th>
          <th>Description</th>
	    </tr>

	    <tr>
	      <td><p>Format Signature</p></td>
	      <td><p>This field contains a constant value and can be used to
	          quickly identify a file as being an HDF5 file. The
	          constant value is designed to allow easy identification of
	          an HDF5 file and to allow certain types of data corruption
	          to be detected.  The file signature of an HDF5 file always
	          contains the following values:</p>
            <center>
              <table border align="center" cellpadding="4">
		        <tr align="center">
		          <td align="right">Decimal:</td>
                  <td width="8%">137</td>
		          <td width="8%">72</td>
		          <td width="8%">68</td>
		          <td width="8%">70</td>
		          <td width="8%">13</td>
		          <td width="8%">10</td>
		          <td width="8%">26</td>
		          <td width="8%">10</td>
		        </tr>

		        <tr align="center">
		          <td align="right">Hexadecimal:</td>
		          <td>89</td>
		          <td>48</td>
		          <td>44</td>
		          <td>46</td>
		          <td>0d</td>
		          <td>0a</td>
		          <td>1a</td>
		          <td>0a</td>
		        </tr>

		        <tr align="center">
		          <td align="right">ASCII C Notation:</td>
		          <td>\211</td>
		          <td>H</td>
		          <td>D</td>
		          <td>F</td>
		          <td>\r</td>
		          <td>\n</td>
		          <td>\032</td>
		          <td>\n</td>
		        </tr>
	          </table>
	        </center>
            <p>This signature both identifies the file as an HDF5 file
	          and provides for immediate detection of common
	          file-transfer problems. The first two bytes distinguish
	          HDF5 files on systems that expect the first two bytes to
	          identify the file type uniquely. The first byte is
	          chosen as a non-ASCII value to reduce the probability
	          that a text file may be misrecognized as an HDF5 file;
	          also, it catches bad file transfers that clear bit
	          7. Bytes two through four name the format. The CR-LF
	          sequence catches bad file transfers that alter newline
	          sequences. The control-Z character stops file display
	          under MS-DOS. The final line feed checks for the inverse
	          of the CR-LF translation problem.  (This is a direct
	          descendent of the
              <a href="http://www.libpng.org/pub/png/spec/iso/index-object.html#5PNG-file-signature">PNG</a> file
              signature.)</p>
            <p><em>This field is present in version 0+ of the superblock.</em>
          </p></td>
        </tr>

	    <tr>
	      <td><p>Version Number of the Superblock</p></td>
	      <td><p>This value is used to determine the format of the
	          information in the superblock.  When the format of the
	          information in the superblock is changed, the version number
	          is incremented to the next integer and can be used to
	          determine how the information in the superblock is
	          formatted.</p>

            <p>Values of 0, 1 and 2 are defined for this field (the
              format of version 2 is described below, not here).
            </p>

            <p><em>This field is present in version 0+ of the superblock.</em>
            </p>
          </td>
	    </tr>

	    <tr>
	      <td><p>Version Number of the File&rsquo;s Free Space
              Information</p></td>
	      <td>
            <p>This value is used to determine the format of the
	          file&rsquo;s free space information.
            </p>
            <p>The only value currently valid in this field is &lsquo;0&rsquo;, which
              indicates that the file&rsquo;s free space is as described
              <a href="#FreeSpaceManager">below</a>.
            </p>

            <p><em>This field is present in versions 0 and 1 of the
                superblock.</em>
            </p>
          </td>
	    </tr>

	    <tr>
	      <td><p>Version Number of the Root Group Symbol Table
              Entry</p></td>
	      <td><p>This value is used to determine the format of the
	          information in the Root Group Symbol Table Entry.  When the
              format of the information in that field is changed, the
	          version number is incremented to the next integer and can be
	          used to determine how the information in the field
	          is formatted.</p>
            <p>The only value currently valid in this field is &lsquo;0&rsquo;,
              which indicates that the root group symbol table entry is
              formatted as described <a href="#SymbolTableEntry">below</a>.</p>
            <p><em>This field is present in version 0 and 1 of the
                superblock.</em></p>
          </td>
	    </tr>

	    <tr>
	      <td><p>Version Number of the Shared Header Message Format</p></td>
	      <td><p>This value is used to determine the format of the
	          information in a shared object header message. Since the format
	          of the shared header messages differs from the other private
	          header messages, a version number is used to identify changes
	          in the format.
            </p>
            <p>The only value currently valid in this field is &lsquo;0&rsquo;, which
              indicates that shared header messages are formatted as
              described <a href="#ObjectHeaderMessages">below</a>.
            </p>

            <p><em>This field is present in version 0 and 1 of the superblock.</em>
            </p>
          </td>
	    </tr>

	    <tr>
	      <td><p><a name="SizeOfOffsetsV0">Size of Offsets</a></p></td>
	      <td><p>This value contains the number of bytes used to store
	          addresses in the file.  The values for the addresses of
	          objects in the file are offsets relative to a base address,
	          usually the address of the superblock signature.  This
	          allows a wrapper to be added after the file is created
	          without invalidating the internal offset locations.
            </p>

            <p><em>This field is present in version 0+ of the superblock.</em>
            </p>
          </td>
	    </tr>

	    <tr>
	      <td><p><a name="SizeOfLengthsV0">Size of Lengths</a></p></td>
	      <td><p>This value contains the number of bytes used to store
	          the size of an object.
            </p>
            <p><em>This field is present in version 0+ of the superblock.</em>
            </p>
          </td>
	    </tr>

	    <tr>
	      <td><p>Group Leaf Node K</p></td>
	      <td>
            <p>Each leaf node of a group B-tree will have at
	          least this many entries but not more than twice this
	          many.  If a group has a single leaf node then it
	          may have fewer entries.
            </p>
            <p>This value must be greater than zero.
            </p>
            <p>See the <a href="#Btrees">description</a> of B-trees below.
            </p>

            <p><em>This field is present in version 0 and 1 of the superblock.</em>
            </p>
          </td>
	    </tr>

	    <tr>
	      <td><p>Group Internal Node K</p></td>
	      <td>
            <p>Each internal node of a group B-tree will have at
	          least this many entries but not more than twice this
	          many.  If the group has only one internal
	          node then it might have fewer entries.
            </p>
            <p>This value must be greater than zero.
            </p>
            <p>See the <a href="#Btrees">description</a> of B-trees below.
            </p>

            <p><em>This field is present in version 0 and 1 of the superblock.</em>
            </p>
          </td>
	    </tr>

        <tr>
          <td><p>File Consistency Flags</p></td>
          <td>
            <p>This field is unused and should be ignored.
            </p>
            <p><em>This field is present in version 0+ of the superblock.</em>
            </p>
          </td>
        </tr>

	    <tr>
	      <td><p>Indexed Storage Internal Node K</p></td>
	      <td>
            <p>Each internal node of an indexed storage B-tree will have at
	          least this many entries but not more than twice this
	          many.  If the index storage B-tree has only one internal
	          node then it might have fewer entries.
            </p>
            <p>This value must be greater than zero.
            </p>
            <p>See the <a href="#Btrees">description</a> of B-trees below.
            </p>

            <p><em>This field is present in version 1 of the superblock.</em>
            </p>
          </td>
	    </tr>

        <tr>
          <td><p>Base Address</p></td>
          <td>
            <p>This is the absolute file address of the first byte of
              the HDF5 data within the file.  The library currently
              constrains this value to be the absolute file address
              of the superblock itself when creating new files;
              future versions of the library may provide greater
              flexibility.  When opening an existing file and this address does
              not match the offset of the superblock, the library assumes
              that the entire contents of the HDF5 file have been adjusted in
              the file and adjusts the base address and end of file address to
              reflect their new positions in the file.  Unless otherwise noted,
              all other file addresses are relative to this base
              address.
            </p>

            <p><em>This field is present in version 0+ of the superblock.</em>
            </p>
          </td>
        </tr>

        <tr>
          <td><p>Address of Global Free-space Index</p></td>
          <td>
            <p>The file&rsquo;s free space is not persistent for version 0 and 1 of
	          the superblock.
              Currently this field always contains the
              <a href="#UndefinedAddress">undefined address</a>.
            </p>

            <p><em>This field is present in version 0 and 1 of the superblock.</em>
            </p>
          </td>
        </tr>

        <tr>
          <td><p>End of File Address</p></td>
          <td>
            <p>This is the absolute file address of the first byte past
              the end of all HDF5 data.  It is used to determine whether a
              file has been accidentally truncated and as an address where
              file data allocation can occur if space from the free list is
              not used.
            </p>

            <p><em>This field is present in version 0+ of the superblock.</em>
            </p>
          </td>
        </tr>

        <tr>
          <td><p>Driver Information Block Address</p></td>
          <td>
            <p>This is the relative file address of the file driver
              information block which contains driver-specific
              information needed to reopen the file. If there is no
              driver information block then this entry should be the
              <a href="#UndefinedAddress">undefined address</a>.
            </p>

            <p><em>This field is present in version 0 and 1 of the superblock.</em>
            </p>
          </td>
        </tr>

        <tr>
          <td><p>Root Group Symbol Table Entry</p></td>
          <td>
            <p>This is the <a href="#SymbolTableEntry">symbol table entry</a>
              of the root group, which serves as the entry point into
              the group graph for the file.
            </p>

            <p><em>This field is present in version 0 and 1 of the superblock.</em>
            </p>
          </td>
        </tr>
      </table>
    </div>

    <br />
    <br />
    <br />
    <p>Versions 2 and 3 of the superblock are described below:</p>

    <div align="center">
      <table class="format">
        <caption>
          Layout: Superblock (Versions 2 and 3)
        </caption>

	    <tr>
	      <th>byte</th>
	      <th>byte</th>
	      <th>byte</th>
	      <th>byte</th>
	    </tr>

	    <tr>
	      <td colspan="4"><br />Format Signature
            <em>(8 bytes)</em><br /><br /></td>
	    </tr>

	    <tr>
	      <td>Version # of Superblock</td>
	      <td>Size of Offsets</td>
	      <td>Size of Lengths</td>
	      <td>File Consistency Flags</td>
	    </tr>

	    <tr>
	      <td colspan="4"><br />Base Address<sup>O</sup><br /><br /></td>
	    </tr>

	    <tr>
	      <td colspan="4"><br />Superblock Extension Address<sup>O</sup><br /><br /></td>
	    </tr>

	    <tr>
	      <td colspan="4"><br />End of File Address<sup>O</sup><br /><br /></td>
	    </tr>

	    <tr>
	      <td colspan="4"><br />Root Group Object Header Address<sup>O</sup><br /><br /></td>
	    </tr>

	    <tr>
	      <td colspan="4">Superblock Checksum</td>
	    </tr>
      </table>

      <table class="note">
        <tr>
          <td width="60%">&nbsp;</td>
          <td width="40%">
            (Items marked with an &lsquo;O&rsquo; in the above table are
            of the size specified in the <a href="#SizeOfOffsetsV0">Size
              of Offsets</a> field in the superblock.)
        </td></tr>
      </table>

    </div>

    <br />
    <div align="center">
      <table class="desc">
        <caption>
          Fields: Superblock (Versions 2 and 3)
        </caption>
	    <tr>
          <th width="30%">Field Name</th>
          <th>Description</th>
	    </tr>

	    <tr>
	      <td><p>Format Signature</p></td>
	      <td>
            <p>This field is the same as described for versions 0 and 1 of the
              superblock.
          </p></td>
	    </tr>

	    <tr>
	      <td><p>Version Number of the Superblock</p></td>
	      <td>
            <p>This field has a value of 2 and has the same meaning as for
              versions 0 and 1.
            </p>
          </td>
	    </tr>

	    <tr>
	      <td><p>Size of Offsets</p></td>
	      <td>
            <p>This field is the same as described for
              <a href="#SizeOfOffsetsV0">versions 0 and 1</a> of the
              superblock.
            </p>
          </td>
	    </tr>

	    <tr>
	      <td><p>Size of Lengths</p></td>
	      <td>
            <p>This field is the same as described for
              <a href="#SizeOfLengthsV0">versions 0 and 1</a> of the
              superblock.
            </p>
          </td>
	    </tr>

        <tr>
          <td><p>File Consistency Flags</p></td>

          <td>
            <p>For superblock version
              2: This field is unused and should be ignored.</p>
            <p>For superblock version
              3: This value contains flags to ensure file consistency for
              file locking. Currently, the following bit flags are defined:
              <ul>
                <li>Bit 0 if set indicates that the file has been opened for
                  write access.</li>
                <li>Bit 1 is reserved for future use.</li>
                <li>Bit 2 if set indicates that the file has been opened for
                  single-writer/multiple-reader (SWMR) write access.</li>
                <li>Bits 3-7 are reserved for future use.</li>
              </ul>
	        <p>
              Bit 0 should be set as the first action when a file has been
              opened for write access. Bit 2 should be set when a file
              has been opened for SWMR write access. These two bits should
              be cleared only as the final action when closing a file.
            </p>
            <p><em>This field is present in version 0+ of the superblock.</em>
            </p>
            <p><em>The size of this
                field has been reduced from 4 bytes in superblock format
                versions 0 and 1 to 1 byte.</em>
            </p>
          </td>

        </tr>

        <tr>
          <td><p>Base Address</p></td>
          <td>
            <p>This field is the same as described for versions 0 and
              1 of the superblock.
            </p>
          </td>
        </tr>

        <tr>
          <td><p>Superblock Extension Address</p></td>
          <td>
            <p>The field is the address of the object header for the
              <a href="#SuperblockExt">superblock extension</a>.
		      If there is no extension then this entry should be the
		      <a href="#UndefinedAddress">undefined address</a>.
            </p>
          </td>
        </tr>

        <tr>
          <td><p>End of File Address</p></td>
          <td>
            <p>This field is the same as described for versions 0 and 1 of the
              superblock.
            </p>
          </td>
        </tr>

        <tr>
          <td><p>Root Group Object Header Address</p></td>
          <td>
            <p>This is the address of
		      the <a href="#DataObject">root group object header</a>,
		      which serves as the entry point into the group graph for the file.
            </p>
          </td>
        </tr>

        <tr>
          <td><p>Superblock Checksum</p></td>
          <td>
            <p>The checksum for the superblock.
            </p>
          </td>
        </tr>

      </table>
    </div>

    <br />

    <h3><a name="DriverInfo">
        II.B. Disk Format: Level 0B - File Driver Info</a></h3>

    <p>The <b>driver information block</b> is an optional region of the
      file which contains information needed by the file driver
      to reopen a file.  The format is described below:</p>


    <div align="center">
      <table class="format">
        <caption>
          Layout: Driver Information Block
        </caption>

        <tr>
          <th>byte</th>
          <th>byte</th>
          <th>byte</th>
          <th>byte</th>
	    </tr>

        <tr>
          <td>Version</td>
          <td colspan="3">Reserved</td>
        </tr>

        <tr>
          <td colspan="4">Driver Information Size</td>
        </tr>

        <tr>
          <td colspan="4"><br />Driver Identification
            <em>(8 bytes)</em><br /><br /></td>
        </tr>

        <tr>
          <td colspan="4"><br /><br />Driver Information
            <em>(variable size)</em><br /><br /><br /></td>
        </tr>
      </table>
    </div>

    <br />
    <div align="center">
      <table class="desc">
        <caption>
          Fields: Driver Information Block
        </caption>
	    <tr>
          <th width="30%">Field Name</th>
          <th>Description</th>
        </tr>

        <tr>
          <td><p>Version</p></td>
          <td>
            <p>The version number of the Driver Information Block.
	          This document describes version 0.
            </p>
          </td>
        </tr>

        <tr>
          <td><p>Driver Information Size</p></td>
          <td>
            <p>The size in bytes of the <em>Driver Information</em> field.
            </p>
          </td>
        </tr>

        <tr>
          <td><p>Driver Identification</p></td>
          <td>
            <p>This is an eight-byte ASCII string without null
              termination which identifies the driver and/or version number
              of the Driver Information Block. The predefined driver encoded
              in this field by the HDF5 Library is identified by the
              letters <code>NCSA</code> followed by the first four characters of
              the driver name. If the Driver Information block is not
              the original version then the last letter(s) of the
              identification will be replaced by a version number in
              ASCII, starting with 0.
            </p>
            <p>
              Identification for user-defined drivers is also eight-byte long.
	          It can be arbitrary but should be unique to avoid
              the four character prefix &ldquo;NCSA&rdquo;.
            </p>
          </td>
        </tr>

        <tr valign="top">
          <td><p>Driver Information</p></td>
          <td>Driver information is stored in a format defined by the
            file driver (see description below).</td>
        </tr>
      </table>
    </div>

    <br />
    <p>The two drivers encoded in the <em>Driver Identification</em>
      field are as follows:</p>
    <ul>
      <li>
        Multi driver:
        <p>
          The identifier for this driver is &ldquo;NCSAmulti&rdquo;.
          This driver provides a mechanism for segregating raw data and different types of metadata
          into multiple files.
          These files are viewed by the library as a single virtual HDF5 file with a single file address.
          A maximum of 6 files will be created for the following data:
          superblock, B-tree, raw data, global heap, local heap, and object header.
          More than one type of data can be written to the same file.
      </p></li>
      <li>
        Family driver
        <p>
          The identifier for this driver is &ldquo;NCSAfami&rdquo; and is encoded in this field for library version 1.8 and after.
          This driver is designed for systems that do not support files larger than 2 gigabytes
          by splitting the HDF5 file address space across several smaller files.
          It does nothing to segregate metadata and raw data;
          they are mixed in the address space just as they would be in a single contiguous file.
      </p></li>
    </ul>
    <p>The format of the <em>Driver Information</em> field for the
      above two drivers are described below:</p>

    <div align="center">
      <table class="format">
        <caption>
          Layout: Multi Driver Information
        </caption>

	    <tr>
	      <th width="25%">byte</th>
	      <th width="25%">byte</th>
	      <th width="25%">byte</th>
	      <th width="25%">byte</th>
	    </tr>

	    <tr>
	      <td>Member Mapping</td>
	      <td>Member Mapping</td>
	      <td>Member Mapping</td>
	      <td>Member Mapping</td>
	    </tr>

	    <tr>
	      <td>Member Mapping</td>
	      <td>Member Mapping</td>
	      <td>Reserved</td>
	      <td>Reserved</td>
	    </tr>

	    <tr>
	      <td colspan="4"><br />Address of Member File 1<br /><br /></td>
	    </tr>

	    <tr>
	      <td colspan="4"><br />End of Address for Member File 1<br /><br /></td>
	    </tr>

	    <tr>
	      <td colspan="4"><br />Address of Member File 2<br /><br /></td>
	    </tr>

	    <tr>
	      <td colspan="4"><br />End of Address for Member File 2<br /><br /></td>
	    </tr>

	    <tr>
	      <td colspan="4"><br />... ...<br /><br /></td>
	    </tr>

	    <tr>
	      <td colspan="4"><br />Address of Member File N<br /><br /></td>
	    </tr>

	    <tr>
	      <td colspan="4"><br />End of Address for Member File N<br /><br /></td>
	    </tr>

	    <tr>
	      <td colspan="4"><br />Name of Member File 1
            <em>(variable size)</em><br /><br /></td>
	    </tr>

	    <tr>
	      <td colspan="4"><br />Name of Member File 2
            <em>(variable size)</em><br /><br /></td>
	    </tr>

	    <tr>
	      <td colspan="4"><br />... ...<br /><br /></td>
	    </tr>

	    <tr>
	      <td colspan="4"><br />Name of Member File N
            <em>(variable size)</em><br /><br /></td>
	    </tr>

      </table>
    </div>

    <br />
    <div align="center">
      <table class="desc">
        <caption>
          Fields: Multi Driver Information
        </caption>
	    <tr>
	      <th width="30%">Field Name</th>
	      <th>Description</th>
	    </tr>

	    <tr>
	      <td><p>Member Mapping</p></td>
	      <td><p>These fields are integer values from 1 to 6
              indicating how the data can be mapped to or merged with another type of
              data.
	          <table class="list">
                <tr>
                  <th width="20%" align="center">Member Mapping</th>
                  <th width="80%" align="left">Description</th>
                </tr>
                <tr>
                  <td align="center">1</td>
                  <td>The superblock data.</td>
                </tr>
                <tr>
                  <td align="center">2</td>
                  <td>The B-tree data.</td>
                </tr>
                <tr>
                  <td align="center">3</td>
                  <td>The raw data.</td>
                </tr>
                <tr>
                  <td align="center">4</td>
                  <td>The global heap data.</td>
                </tr>
                <tr>
                  <td align="center">5</td>
                  <td>The local heap data.</td>
                </tr>
                <tr>
                  <td align="center">6</td>
                  <td>The object header data.</td>
                </tr>
            </table></p>
            <p>For example, if the third field has the value 3 and all the rest have the
              value 1, it means there are two files: one for raw data, and one for superblock,
              B-tree, global heap, local heap, and object header.</p>
          </td>
	    </tr>

	    <tr>
	      <td><p>Reserved</p></td>
	      <td><p>These fields are reserved and should always be zero.</p></td>
	    </tr>

	    <tr>
	      <td><p>Address of Member File N</p></td>
	      <td><p>This field Specifies the virtual address at which the member file starts.</p>
	        <p>N is the number of member files.</p>
	      </td>
	    </tr>

	    <tr>
	      <td><p>End of Address for Member File N</p></td>
	      <td><p>This field is the end of the allocated address for the member file.
          </p></td>
	    </tr>

	    <tr>
	      <td><p>Name of Member File N</p></td>
	      <td><p>This field is the null-terminated name of the member file and
		      its length should be multiples of 8 bytes.
		      Additional bytes will be padded with <em>NULL</em>s. The default naming
		      convention is <em>%s-X.h5</em>, where <em>X</em> is one of the letters
              <em>s</em> (for superblock), <em>b</em> (for B-tree), <em>r</em> (for raw data),
              <em>g</em> (for global heap), <em>l</em> (for local heap), and <em>o</em> (for
              object header). The name of the whole HDF5 file will substitute the <em>%s</em>
              in the string.
            </p>
          </td>
	    </tr>
      </table>
    </div>

    <br />
    <br />
    <br />
    <div align="center">
      <table class="format">
        <caption>
          Layout: Family Driver Information
        </caption>

	    <tr>
	      <th width="25%">byte</th>
	      <th width="25%">byte</th>
	      <th width="25%">byte</th>
	      <th width="25%">byte</th>
	    </tr>

	    <tr>
	      <td colspan="8"><br />Size of Member File<br /><br /></td>
	    </tr>

      </table>
    </div>

    <br />
    <div align="center">
      <table class="desc">
        <caption>
          Fields: Family Driver Information
        </caption>
	    <tr>
	      <th width="30%">Field Name</th>
	      <th>Description</th>
	    </tr>

	    <tr>
	      <td><p>Size of Member File</p></td>
	      <td><p>This field is the size of the member file in the family of files.</p></td>
	    </tr>
      </table>
    </div>

    <h3><a name="SuperblockExt">
        II.C. Disk Format: Level 0C - Superblock Extension</a></h3>

    <p>The <em>superblock extension</em> is used to store superblock metadata
      which is either optional, or added after the version of the superblock
      was defined. Superblock extensions may only exist when version 2
      or later of the superblock is used. A superblock extension is an object
      header which may hold the following messages:</p>
	<ul>
	  <li>
	    <a href="#SOHMTableMessage">Shared Message Table message</a> containing
        information to locate the master table of shared object header message
        indices.</li>
	  <li>
	    <a href="#BtreeKValuesMessage">B-tree &lsquo;K&rsquo; Values message</a> containing
        non-default B-tree &lsquo;K&rsquo; values.</li>
	  <li>
	    <a href="#DrvInfoMessage">Driver Info message</a> containing information
        needed by the file driver in order to reopen a file.
        See also the
        <a href="#DriverInfo">&ldquo;Disk Format: Level 0B - File Driver
          Info&rdquo;</a> section above.</li>
	  <li>
	    <a href="#FsinfoMessage">File Space Info message</a> containing
	    information about file space handling in the file.</li>
	</ul>



    <h2><a name="FileInfra">
        III. Disk Format: Level 1 - File Infrastructure</a></h2>

    <h3><a name="Btrees">
        III.A. Disk Format: Level 1A - B-trees and B-tree Nodes</a></h3>

    <p>B-trees allow flexible storage for objects which tend to grow
      in ways that cause the object to be stored discontiguously.  B-trees
      are described in various algorithms books including &ldquo;Introduction to
      Algorithms&rdquo; by Thomas H. Cormen, Charles E. Leiserson, and Ronald
      L. Rivest.  B-trees are used in several places in the HDF5 file format,
      when an index is needed for another data structure.</p>

    <p>The version 1 B-tree structure described below is the original
      index structure. The version 1 B-trees are being phased out in
      favor of the version 2 B-trees described below. Note that both
      types of structures may be found in the same file depending on
      the application settings when creating the file.</p>

    <h4><a name="V1Btrees">
        III.A.1. Disk Format: Level 1A1 - Version 1 B-trees</a></h4>

    <p>Version 1 B-trees in HDF5 files are an implementation of the
      B-link tree. The sibling nodes at a particular level in
      the tree are stored in a doubly-linked list. See the
      &ldquo;Efficient Locking for Concurrent Operations on B-trees&rdquo;
      paper by Phillip Lehman and S. Bing Yao as published in the
      <cite>ACM Transactions on Database Systems</cite>, Vol. 6, No. 4,
      December 1981.</p>

    <p>The B-trees implemented by the file format contain one more
      key than the number of children. In other words, each child
      pointer out of a B-tree node has a left key and a right key.
      The pointers out of internal nodes point to sub-trees while
      the pointers out of leaf nodes point to symbol nodes and
      raw data chunks.
      Aside from that difference, internal nodes and leaf nodes
      are identical.</p>

    <div align="center">
      <table class="format">
        <caption>
          Layout: B-tree Nodes
        </caption>

        <tr>
          <th>byte</th>
          <th>byte</th>
          <th>byte</th>
          <th>byte</th>
        </tr>

        <tr>
          <td colspan="4">Signature</td>
        </tr>

        <tr>
          <td>Node Type</td>
          <td>Node Level</td>
          <td colspan="2">Entries Used</td>
        </tr>

        <tr>
          <td colspan="4"><br />Address of Left Sibling<sup>O</sup><br /><br /></td>
        </tr>

        <tr>
          <td colspan="4"><br />Address of Right Sibling<sup>O</sup><br /><br /></td>
        </tr>

        <tr>
          <td colspan="4">Key 1 <em>(variable size)</em></td>
        </tr>

        <tr>
          <td colspan="4"><br />Address of Child 1<sup>O</sup><br /><br /></td>
        </tr>

        <tr>
          <td colspan="4">Key 2 <em>(variable size)</em></td>
        </tr>

        <tr>
          <td colspan="4"><br />Address of Child 2<sup>O</sup><br /><br /></td>
        </tr>

        <tr>
          <td colspan="4">...</td>
        </tr>

        <tr>
          <td colspan="4">Key 2<em>K</em> <em>(variable size)</em></td>
        </tr>

        <tr>
          <td colspan="4"><br />Address of Child 2<em>K</em><sup>O</sup><br /><br /></td>
        </tr>

        <tr>
          <td colspan="4">Key 2<em>K</em>+1
            <em>(variable size)</em></td>
        </tr>
      </table>

      <table class="note">
        <tr>
          <td width="60%">&nbsp;</td>
          <td width="40%">
            (Items marked with an &lsquo;O&rsquo; in the above table are
            of the size specified in the <a href="#SizeOfOffsetsV0">Size
              of Offsets</a> field in the superblock.)
        </td></tr>
      </table>

    </div>

    <br />
    <div align="center">
      <table class="desc">
        <caption>
          Fields: B-tree Nodes
        </caption>
	    <tr>
          <th width="30%">Field Name</th>
          <th>Description</th>
        </tr>

        <tr>
          <td><p>Signature</p></td>
          <td>
            <p>The ASCII character string &ldquo;<code>TREE</code>&rdquo;
              is used to indicate the beginning of a B-tree node. This
              gives file consistency checking utilities a better chance
              of reconstructing a damaged file.
            </p>
          </td>
        </tr>

        <tr>
          <td><p>Node Type</p></td>
          <td>
            <p>Each B-tree points to a particular type of data.
              This field indicates the type of data as well as
              implying the maximum degree <em>K</em> of the tree and
              the size of each Key field.


              <table class="list">
                <tr>
                  <th width="20%" align="center">Node Type</th>
                  <th width="80%" align="left">Description</th>
                </tr>
                <tr>
                  <td align="center">0</td>
                  <td>This tree points to group nodes.</td>
                </tr>
                <tr>
                  <td align="center">1</td>
                  <td>This tree points to raw data chunk nodes.</td>
                </tr>
            </table></p>
          </td>
        </tr>

        <tr>
          <td><p>Node Level</p></td>
          <td>
            <p>The node level indicates the level at which this node
              appears in the tree (leaf nodes are at level zero).  Not
              only does the level indicate whether child pointers
              point to sub-trees or to data, but it can also be used
              to help file consistency checking utilities reconstruct
              damaged trees.
            </p>
          </td>
        </tr>

        <tr valign="top">
          <td><p>Entries Used</p></td>
          <td>
            <p>This determines the number of children to which this
              node points.  All nodes of a particular type of tree
              have the same maximum degree, but most nodes will point
              to less than that number of children.  The valid child
              pointers and keys appear at the beginning of the node
              and the unused pointers and keys appear at the end of
              the node.  The unused pointers and keys have undefined
              values.
            </p>
          </td>
        </tr>

        <tr valign="top">
          <td><p>Address of Left Sibling</p></td>
          <td>
            <p>This is the relative file address of the left sibling of
              the current node.  If the current
              node is the left-most node at this level then this field
              is the <a href="#UndefinedAddress">undefined address</a>.
            </p>
          </td>
        </tr>

        <tr valign="top">
          <td><p>Address of Right Sibling</p></td>
          <td>
            <p>This is the relative file address of the right sibling of
              the current node.  If the current
              node is the right-most node at this level then this
              field is the <a href="#UndefinedAddress">undefined address</a>.
            </p>
          </td>
        </tr>

        <tr valign="top">
          <td><p>Keys and Child Pointers</p></td>
          <td>
            <p>Each tree has 2<em>K</em>+1 keys with 2<em>K</em>
              child pointers interleaved between the keys. The number
              of keys and child pointers actually containing valid
              values is determined by the node&rsquo;s <em>Entries
                Used</em> field. If that field is <em>N</em>, then the
              B-tree contains <em>N</em> child pointers and
              <em>N</em>+1 keys.
            </p>
          </td>
        </tr>

        <tr valign="top">
          <td><p>Key</p></td>
          <td>
            <p>The format and size of the key values is determined by
              the type of data to which this tree points.  The keys are
              ordered and are boundaries for the contents of the child
              pointer; that is, the key values represented by child
              <em>N</em> fall between Key <em>N</em> and Key
              <em>N</em>+1. Whether the interval is open or closed on
              each end is determined by the type of data to which the
              tree points.
            </p>

            <p>
              The format of the key depends on the node type.
              For nodes of node type 0 (group nodes), the key is formatted as
              follows:

              <table class="list">
                <tr>
                  <td width="20%">A single field of
                    <i><a href="#SizeOfLengthsV0">Size of Lengths</a></i>
                    bytes:</td>
                  <td width="80%">Indicates the byte offset into the local heap
                    for the first object name in the subtree which
                    that key describes.
                  </td>
                </tr>
              </table>
            </p>


            <p>
              For nodes of node type 1 (chunked raw data nodes), the key is
              formatted as follows:

              <table class="list">
                <tr>
                  <td width="20%">Bytes 1-4:</td>
                  <td width="80%">Size of chunk in bytes.</td>
                </tr>
                <tr>
                  <td>Bytes 4-8:</td>
                  <td>Filter mask, a 32-bit bit field indicating which
                    filters have been skipped for this chunk.  Each filter
                    has an index number in the pipeline (starting at 0, with
                    the first filter to apply) and if that filter is skipped,
                    the bit corresponding to its index is set.</td>
                </tr>
                <tr>
                  <td>(<em>D + 1</em>) 64-bit fields:</td>
                  <td>The offset of the
                    chunk within the dataset where <i>D</i> is the number
                    of dimensions of the dataset, and the last value is the
                    offset within the dataset&rsquo;s datatype and should
                    always be zero. For example, if
                    a chunk in a 3-dimensional dataset begins at the
                    position <code>[5,5,5]</code>, there will be three
                    such 64-bit values, each with the value of
                    <code>5</code>, followed by a <code>0</code> value.</td>
                </tr>
              </table>
            </p>

          </td>
        </tr>

        <tr valign="top">
          <td><p>Child Pointer</p></td>
          <td>
            <p>The tree node contains file addresses of subtrees or
              data depending on the node level.  Nodes at Level 0 point
              to data addresses, either raw data chunks or group nodes.
              Nodes at non-zero levels point to other nodes of the
              same B-tree.
            </p>
            <p>For raw data chunk nodes, the child pointer is the address
              of a single raw data chunk.  For group nodes, the child pointer
              points to a <a href="#SymbolTable">symbol table</a>, which contains
              information for multiple symbol table entries.
            </p>
          </td>
        </tr>
      </table>
    </div>

    <p>
      Conceptually, each B-tree node looks like this:</p>
    <center>
      <table>
        <tr valign="top" align="center">
          <td>key[0]</td><td>&nbsp;</td>
          <td>child[0]</td><td>&nbsp;</td>
          <td>key[1]</td><td>&nbsp;</td>
          <td>child[1]</td><td>&nbsp;</td>
          <td>key[2]</td><td>&nbsp;</td>
          <td>...</td><td>&nbsp;</td>
          <td>...</td><td>&nbsp;</td>
          <td>key[<i>N</i>-1]</td><td>&nbsp;</td>
          <td>child[<i>N</i>-1]</td><td>&nbsp;</td>
          <td>key[<i>N</i>]</td>
        </tr>
      </table>
    </center>
    <br />

    where child[<i>i</i>] is a pointer to a sub-tree (at a level
    above Level 0) or to data (at Level 0).
    Each key[<i>i</i>] describes an <i>item</i> stored by the B-tree
    (a chunk or an object of a group node).  The range of values
    represented by child[<i>i</i>] is indicated by key[<i>i</i>]
    and key[<i>i</i>+1].


    <p>The following question must next be answered:
      &ldquo;Is the value described by key[<i>i</i>] contained in
      child[<i>i</i>-1] or in child[<i>i</i>]?&rdquo;
      The answer depends on the type of tree.
      In trees for groups (node type 0), the object described by
      key[<i>i</i>] is the greatest object contained in
      child[<i>i</i>-1] while in chunk trees (node type 1) the
      chunk described by key[<i>i</i>] is the least chunk in
      child[<i>i</i>].</p>

    <p>That means that key[0] for group trees is sometimes unused;
      it points to offset zero in the heap, which is always the
      empty string and compares as &ldquo;less-than&rdquo; any valid
      object name.</p>

    <p>And key[<i>N</i>] for chunk trees is sometimes unused;
      it contains a chunk offset which compares as &ldquo;greater-than&rdquo;
      any other chunk offset and has a chunk byte size of zero
      to indicate that it is not actually allocated.</p>

    <h4><a name="V2Btrees">
        III.A.2. Disk Format: Level 1A2 - Version 2 B-trees</a></h4>

    <p>Version 2 (v2) B-trees are &ldquo;traditional&rdquo; B-trees
      with one major difference. Instead of just using a simple pointer
      (or address in the file) to a child of an internal node, the pointer
      to the child node contains two additional pieces of information:
      the number of records in the child node itself, and the total number
      of records in the child node and all its descendants. Storing this
      additional information allows fast array-like indexing to locate
      the n<sup>th</sup> record in the B-tree.</p>

    <p>The entry into a version 2 B-tree is a header which contains global
      information about the structure of the B-tree.  The <em>root node
        address</em>
      field in the header points to the B-tree root node, which is either an
      internal or leaf node, depending on the value in the header&rsquo;s
      <em>depth</em> field.  An internal node consists of records plus
      pointers to further leaf or internal nodes in the tree.  A leaf node
      consists of solely of records.  The format of the records depends on
      the B-tree type (stored in the header).</p>

    <div align="center">
      <table class="format">
        <caption>
          Layout: Version 2 B-tree Header
        </caption>

        <tr>
          <th>byte</th>
          <th>byte</th>
          <th>byte</th>
          <th>byte</th>

        <tr>
          <td colspan="4">Signature</td>
        </tr>
        <tr>
          <td>Version</td>
          <td>Type</td>
          <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
	    </tr>
	    <tr>
          <td colspan="4">Node Size</td>
	    </tr>
	    <tr>
          <td colspan="2">Record Size</td>
          <td colspan="2">Depth</td>
	    </tr>
	    <tr>
          <td>Split Percent</td>
          <td>Merge Percent</td>
          <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
	    </tr>
	    <tr>
          <td colspan="4"><br />Root Node Address<sup>O</sup><br /><br /></td>
	    </tr>
	    <tr>
          <td colspan="2">Number of Records in Root Node</td>
          <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
	    </tr>
	    <tr>
          <td colspan="4"><br />Total Number of Records in B-tree<sup>L</sup><br /><br /></td>
	    </tr>
	    <tr>
          <td colspan="4">Checksum</td>
	    </tr>
      </table>

      <table class="note">
        <tr>
          <td width="60%">&nbsp;</td>
          <td width="40%">
            (Items marked with an &lsquo;O&rsquo; in the above table are
            of the size specified in the <a href="#SizeOfOffsetsV0">Size
              of Offsets</a> field in the superblock.)
        </td></tr>
        <tr>
          <td>&nbsp;</td>
          <td>
            (Items marked with an &lsquo;L&rsquo; in the above table are
            of the size specified in the <a href="#SizeOfLengthsV0">Size
              of Lengths</a> field in the superblock.)
        </td></tr>
      </table>

    </div>

    <br />
    <div align="center">
      <table class="desc">
        <caption>
          Fields: Version 2 B-tree Header
        </caption>

        <tr>
          <th width="30%">Field Name</th>
          <th>Description</th>
        </tr>

        <tr>
          <td><p>Signature</p></td>
          <td>
            <p>The ASCII character string &ldquo;<code>BTHD</code>&rdquo;
              is used to indicate the header of a version 2 (v2) B-tree
              node.
            </p>
          </td>
        </tr>

        <tr>
          <td><p>Version</p></td>
          <td>
            <p>The version number for this B-tree header.  This document
              describes version 0.
            </p>
          </td>
        </tr>

        <tr>
          <td><p>Type</p></td>
          <td>
            <p>This field indicates the type of B-tree:
              <table class="list">
                <tr>
                  <th width="20%" align="center">Value</th>
                  <th width="80%" align="left">Description</th>
                </tr>
                <tr>
                  <td align="center">0</td>
                  <td>This B-tree is used for testing only. This
                    value should <em>not</em> be used for storing
                    records in actual HDF5 files.
                  </td>
                </tr>
                <tr>
                  <td align="center">1</td>
                  <td>This B-tree is used for indexing indirectly accessed,
                    non-filtered &lsquo;huge&rsquo; fractal heap objects.
                  </td>
                </tr>
                <tr>
                  <td align="center">2</td>
                  <td>This B-tree is used for indexing indirectly accessed,
                    filtered &lsquo;huge&rsquo; fractal heap objects.
                  </td>
                </tr>
                <tr>
                  <td align="center">3</td>
                  <td>This B-tree is used for indexing directly accessed,
                    non-filtered &lsquo;huge&rsquo; fractal heap objects.
                  </td>
                </tr>
                <tr>
                  <td align="center">4</td>
                  <td>This B-tree is used for indexing directly accessed,
                    filtered &lsquo;huge&rsquo; fractal heap objects.
                  </td>
                </tr>
                <tr>
                  <td align="center">5</td>
                  <td>This B-tree is used for indexing the &lsquo;name&rsquo; field for
                    links in indexed groups.
                  </td>
                </tr>
                <tr>
                  <td align="center">6</td>
                  <td>This B-tree is used for indexing the &lsquo;creation order&rsquo;
                    field for links in indexed groups.
                  </td>
                </tr>
                <tr>
                  <td align="center">7</td>
                  <td>This B-tree is used for indexing shared object header
                    messages.
                  </td>
                </tr>
                <tr>
                  <td align="center">8</td>
                  <td>This B-tree is used for indexing the &lsquo;name&rsquo; field for
                    indexed attributes.
                  </td>
                </tr>
                <tr>
                  <td align="center">9</td>
                  <td>This B-tree is used for indexing the &lsquo;creation order&rsquo;
                    field for indexed attributes.
                  </td>
                </tr>

                <tr>
                  <td align="center">10</td>
                  <td>This B-tree is used for indexing chunks of
                    datasets with no filters and with more than one
                    dimension of unlimited extent.
                  </td>
                </tr>

                <tr>
                  <td align="center">11</td>
                  <td>This B-tree is used for indexing chunks of
                    datasets with filters and more than one dimension
                    of unlimited extent.
                  </td>
                </tr>
            </table></p>
            <p>The format of records for each type is described below.</p>
          </td>
        </tr>

        <tr valign="top">
          <td><p>Node Size</p></td>
          <td>
            <p>This is the size in bytes of all B-tree nodes.
            </p>
          </td>
        </tr>

        <tr valign="top">
          <td><p>Record Size</p></td>
          <td>
            <p>This field is the size in bytes of the B-tree record.
            </p>
          </td>
        </tr>

        <tr valign="top">
          <td><p>Depth</p></td>
          <td>
            <p>This is the depth of the B-tree.
            </p>
          </td>
        </tr>

        <tr valign="top">
          <td><p>Split Percent</p></td>
          <td>
            <p>The percent full that a node needs to increase above before it
              is split.
            </p>
          </td>
        </tr>

        <tr valign="top">
          <td><p>Merge Percent</p></td>
          <td>
            <p>The percent full that a node needs to be decrease below before it
              is split.
            </p>
          </td>
        </tr>

        <tr valign="top">
          <td><p>Root Node Address</p></td>
          <td>
            <p>This is the address of the root B-tree node.  A B-tree with
              no records will have the <a href="#UndefinedAddress">undefined
                address</a> in this field.
            </p>
          </td>
        </tr>

        <tr valign="top">
          <td><p>Number of Records in Root Node</p></td>
          <td>
            <p>This is the number of records in the root node.
            </p>
          </td>
        </tr>

        <tr valign="top">
          <td><p>Total Number of Records in B-tree</p></td>
          <td>
            <p>This is the total number of records in the entire B-tree.
            </p>
          </td>
        </tr>

        <tr valign="top">
          <td><p>Checksum</p></td>
          <td>
            <p>This is the checksum for the B-tree header.
            </p>
          </td>
        </tr>
      </table>
    </div>

    <br />
    <br />
    <br />
    <div align="center">
      <table class="format">
        <caption>
          Layout: Version 2 B-tree Internal Node
        </caption>

        <tr>
          <th>byte</th>
          <th>byte</th>
          <th>byte</th>
          <th>byte</th>
        </tr>

        <tr>
          <td colspan="4">Signature</td>
        </tr>
        <tr>
          <td>Version</td>
          <td>Type</td>
          <td colspan="2">Records 0, 1, 2...N-1 <em>(variable size)</em></td>
        </tr>
	    <tr>
	      <td colspan="4"><br />Child Node Pointer 0<sup>O</sup><br /><br /></td>
	    </tr>
        <tr>
	      <td colspan="4"><br />Number of Records N<sub>0</sub> for Child
            Node 0 <em>(variable size)</em></td>
	    </tr>
	    <tr>
	      <td colspan="4"><br />Total Number of Records for Child Node 0
            <em>(optional, variable size)</em></td>
	    </tr>
	    <tr>
	      <td colspan="4"><br />Child Node Pointer 1<sup>O</sup><br /><br /></td>
	    </tr>
	    <td colspan="4"><br />Number of Records N<sub>1</sub> for
          Child Node 1 <em>(variable size)</em></td>
</tr>
<tr>
  <td colspan="4"><br />Total Number of Records for Child Node 1
    <em>(optional, variable size)</em></td>
</tr>
<tr>
  <td colspan="4">...</td>
</tr>
<tr>
  <td colspan="4"><br />Child Node Pointer N<sup>O</sup><br /><br /></td>
</tr>
<tr>
  <td colspan="4"><br />Number of Records N<sub>n</sub> for
    Child Node N <em>(variable size)</em></td>
</tr>
<tr>
  <td colspan="4"><br />Total Number of Records for Child Node N
    <em>(optional, variable size)</em></td>
</tr>
<tr>
  <td colspan="4">Checksum</td>
</tr>
</table>

<table class="note">
  <tr>
    <td width="60%">&nbsp;</td>
    <td width="40%">
      (Items marked with an &lsquo;O&rsquo; in the above table are
      of the size specified in the <a href="#SizeOfOffsetsV0">Size
        of Offsets</a> field in the superblock.)
  </td></tr>
</table>
</div>


<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Version 2 B-tree Internal Node
    </caption>
	<tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
    </tr>

    <tr>
      <td><p>Signature</p></td>
      <td>
        <p>The ASCII character string &ldquo;<code>BTIN</code>&rdquo; is
          used to indicate the internal node of a B-tree.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Version</p></td>
      <td>
        <p>The version number for this B-tree internal node.
	      This document describes version 0.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Type</p></td>
      <td>
        <p>This field is the type of the B-tree node.  It should always
          be the same as the B-tree type in the header.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Records</p></td>
      <td>
        <p>The size of this field is determined by the number of records
	      for this node and the record size (from the header).  The format
          of records depends on the type of B-tree.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Child Node Pointer</p></td>
      <td>
        <p>This field is the address of the child node pointed to by the
          internal node.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Number of Records in Child Node</p></td>
      <td>
        <p>This is the number of records in the child node pointed to by
          the corresponding <em>Node Pointer</em>.
        </p>
        <p>The number of bytes used to store this field is determined by
          the maximum possible number of records able to be stored in the
          child node.
        </p>
        <p>
          The maximum number of records in a child node is computed
          in the following way:

          <ul>
            <li>Subtract the fixed size overhead for
              the child node (for example, its signature, version,
              checksum, and so on and <em>one</em> pointer triplet
              of information for the child node (because there is one
              more pointer triplet than records in each internal node))
              from the size of nodes for the B-tree. </li>
            <li>Divide that result by the size of a record plus the
              pointer triplet of information stored to reach each
              child node from this node.</li>
          </ul>

        </p>
        <p>
          Note that leaf nodes do not encode any
          child pointer triplets, so the maximum number of records in a
          leaf node is just the node size minus the leaf node overhead,
          divided by the record size.
        </p>
        <p>
          Also note that the first level of internal nodes above the
          leaf nodes do not encode the <em>Total Number of Records in Child
            Node</em> value in the child pointer triplets (since it is the
          same as the <em>Number of Records in Child Node</em>), so the
          maximum number of records in these nodes is computed with the
          equation above, but using (<em>Child Pointer</em>, <em>Number of
            Records in Child Node</em>) pairs instead of triplets.
        </p>
        <p>
          The number of
          bytes used to encode this field is the least number of bytes
          required to encode the maximum number of records in a child
          node value for the child nodes below this level
          in the B-tree.
        </p>
        <p>
          For example, if the maximum number of child records is
          123, one byte will be used to encode these values in this
          node; if the maximum number of child records is
          20000, two bytes will be used to encode these values in this
          node; and so on. The maximum number of bytes used to
          encode these values is 8 (in other words, an unsigned
          64-bit integer).
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Total Number of Records in Child Node</p></td>
      <td>
        <p>This is the total number of records for the node pointed to by
          the corresponding <em>Node Pointer</em> and all its children.
          This field exists only in nodes whose depth in the B-tree node
          is greater than 1 (in other words, the &ldquo;twig&rdquo;
          internal nodes, just above leaf nodes, do not store this
          field in their child node pointers).
        </p>
        <p>The number of bytes used to store this field is determined by
          the maximum possible number of records able to be stored in the
          child node and its descendants.
        </p>
        <p>
          The maximum possible number of records able to be stored in a
          child node and its descendants is computed iteratively, in the
          following way:  The maximum number of records in a leaf node
          is computed, then that value is used to compute the maximum
          possible number of records in the first level of internal nodes
          above the leaf nodes.  Multiplying these two values together
          determines the maximum possible number of records in child node
          pointers for the level of nodes two levels above leaf nodes.
          This process is continued up to any level in the B-tree.
        </p>
        <p>
          The number of bytes used to encode this value is computed in
          the same way as for the <em>Number of Records in Child Node</em>
          field.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Checksum</p></td>
      <td>
        <p>This is the checksum for this node.
        </p>
      </td>
    </tr>

  </table>
</div>

<br />
<br />
<br />
<div align="center">
  <table class="format">
    <caption>
      Layout: Version 2 B-tree Leaf Node
    </caption>

    <tr>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
    </tr>

    <tr>
      <td colspan="4">Signature</td>
    </tr>
    <tr>
      <td>Version</td>
      <td>Type</td>
      <td colspan="2">Record 0, 1, 2...N-1 <em>(variable size)</em></td>
	</tr>
	<tr>
	  <td colspan="4">Checksum</td>
    </tr>
  </table>
</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Version 2 B-tree Leaf Node
    </caption>
	<tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
    </tr>

    <tr>
      <td><p>Signature</p></td>
      <td>
        <p>The ASCII character string &ldquo;<code>BTLF</code>&ldquo;
          is used to indicate the leaf node of a version 2 (v2) B-tree.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Version</p></td>
      <td>
        <p>The version number for this B-tree leaf node.
	      This document describes version 0.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Type</p></td>
      <td>
        <p>This field is the type of the B-tree node.  It should always
          be the same as the B-tree type in the header.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Records</p></td>
      <td>
        <p>The size of this field is determined by the number of records
	      for this node and the record size (from the header).  The format
          of records depends on the type of B-tree.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Checksum</p></td>
      <td>
        <p>This is the checksum for this node.
        </p>
      </td>
    </tr>

  </table>
</div>

<br />
<br />
<br />
<p>The record layout for each stored (in other words, non-testing)
  B-tree type is as follows:</p>

<div align="center">
  <table class="format">
    <caption>
      Layout: Version 2 B-tree, Type 1 Record Layout - Indirectly
      Accessed, Non-filtered, &lsquo;Huge&rsquo; Fractal Heap Objects
    </caption>

    <tr>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
	</tr>

    <tr>
      <td colspan="4"><br />Huge Object Address<sup>O</sup><br /><br /></td>
    </tr>
    <tr>
      <td colspan="4"><br />Huge Object Length<sup>L</sup><br /><br /></td>
    </tr>
    <tr>
      <td colspan="4"><br />Huge Object ID<sup>L</sup><br /><br /></td>
    </tr>
  </table>

  <table class="note">
    <tr>
      <td width="60%">&nbsp;</td>
      <td width="40%">
        (Items marked with an &lsquo;O&rsquo; in the above table are
        of the size specified in the <a href="#SizeOfOffsetsV0">Size
          of Offsets</a> field in the superblock.)
    </td></tr>
    <tr>
      <td>&nbsp;</td>
      <td>
        (Items marked with an &lsquo;L&rsquo; in the above table are
        of the size specified in the <a href="#SizeOfLengthsV0">Size
          of Lengths</a> field in the superblock.)
    </td></tr>
  </table>

</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Version 2 B-tree, Type 1 Record Layout - Indirectly
      Accessed, Non-filtered, &lsquo;Huge&rsquo; Fractal Heap Objects
    </caption>
	<tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
    </tr>

    <tr>
      <td><p>Huge Object Address</p></td>
      <td>
        <p>The address of the huge object in the file.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Huge Object Length</p></td>
      <td>
        <p>The length of the huge object in the file.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Huge Object ID</p></td>
      <td>
        <p>The heap ID for the huge object.
        </p>
      </td>
    </tr>

  </table>
</div>

<br />
<br />
<br />
<div align="center">
  <table class="format">
    <caption>
      Layout: Version 2 B-tree, Type 2 Record Layout - Indirectly
      Accessed, Filtered, &lsquo;Huge&rsquo; Fractal Heap Objects
    </caption>

    <tr>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
    </tr>

    <tr>
      <td colspan="4"><br />Filtered Huge Object Address<sup>O</sup><br /><br /></td>
    </tr>
    <tr>
      <td colspan="4"><br />Filtered Huge Object Length<sup>L</sup><br /><br /></td>
    </tr>
    <tr>
      <td colspan="4">Filter Mask</td>
    </tr>
    <tr>
      <td colspan="4"><br />Filtered Huge Object Memory Size<sup>L</sup><br /><br /></td>
    </tr>
    <tr>
      <td colspan="4"><br />Huge Object ID<sup>L</sup><br /><br /></td>
    </tr>
  </table>

  <table class="note">
    <tr>
      <td width="60%">&nbsp;</td>
      <td width="40%">
        (Items marked with an &lsquo;O&rsquo; in the above table are
        of the size specified in the <a href="#SizeOfOffsetsV0">Size
          of Offsets</a> field in the superblock.)
    </td></tr>
    <tr>
      <td>&nbsp;</td>
      <td>
        (Items marked with an &lsquo;L&rsquo; in the above table are
        of the size specified in the <a href="#SizeOfLengthsV0">Size
          of Lengths</a> field in the superblock.)
    </td></tr>
  </table>

</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Version 2 B-tree, Type 2 Record Layout - Indirectly
      Accessed, Filtered, &lsquo;Huge&rsquo; Fractal Heap Objects
    </caption>
	<tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
    </tr>

    <tr>
      <td><p>Filtered Huge Object Address</p></td>
      <td>
        <p>The address of the filtered huge object in the file.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Filtered Huge Object Length</p></td>
      <td>
        <p>The length of the filtered huge object in the file.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Filter Mask</p></td>
      <td>
        <p>A 32-bit bit field indicating which filters have been skipped for
          this chunk.  Each filter has an index number in the pipeline
          (starting at 0, with the first filter to apply) and if that
          filter is skipped, the bit corresponding to its index is set.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Filtered Huge Object Memory Size</p></td>
      <td>
        <p>The size of the de-filtered huge object in memory.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Huge Object ID</p></td>
      <td>
        <p>The heap ID for the huge object.
        </p>
      </td>
    </tr>

  </table>
</div>

<br />
<br />
<br />
<div align="center">
  <table class="format">
    <caption>
      Layout: Version 2 B-tree, Type 3 Record Layout - Directly
      Accessed, Non-filtered, &lsquo;Huge&rsquo; Fractal Heap Objects
    </caption>

    <tr>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
	</tr>

    <tr>
      <td colspan="4"><br />Huge Object Address<sup>O</sup><br /><br /></td>
    </tr>
    <tr>
      <td colspan="4"><br />Huge Object Length<sup>L</sup><br /><br /></td>
    </tr>
  </table>

  <table class="note">
    <tr>
      <td width="60%">&nbsp;</td>
      <td width="40%">
        (Items marked with an &lsquo;O&rsquo; in the above table are
        of the size specified in the <a href="#SizeOfOffsetsV0">Size
          of Offsets</a> field in the superblock.)
    </td></tr>
    <tr>
      <td>&nbsp;</td>
      <td>
        (Items marked with an &lsquo;L&rsquo; in the above table are
        of the size specified in the <a href="#SizeOfLengthsV0">Size
          of Lengths</a> field in the superblock.)
    </td></tr>
  </table>

</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Version 2 B-tree, Type 3 Record Layout - Directly
      Accessed, Non-filtered, &lsquo;Huge&rsquo; Fractal Heap Objects
    </caption>
    <tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
    </tr>

    <tr>
      <td><p>Huge Object Address</p></td>
      <td>
        <p>The address of the huge object in the file.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Huge Object Length</p></td>
      <td>
        <p>The length of the huge object in the file.
        </p>
      </td>
    </tr>

  </table>
</div>

<br />
<br />
<br />
<div align="center">
  <table class="format">
    <caption>
      Layout: Version 2 B-tree, Type 4 Record Layout - Directly
      Accessed, Filtered, &lsquo;Huge&rsquo; Fractal Heap Objects
    </caption>

    <tr>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
    </tr>

    <tr>
      <td colspan="4"><br />Filtered Huge Object Address<sup>O</sup><br /><br /></td>
    </tr>
    <tr>
      <td colspan="4"><br />Filtered Huge Object Length<sup>L</sup><br /><br /></td>
    </tr>
    <tr>
      <td colspan="4">Filter Mask</td>
    </tr>
    <tr>
      <td colspan="4"><br />Filtered Huge Object Memory Size<sup>L</sup><br /><br /></td>
    </tr>
  </table>

  <table class="note">
    <tr>
      <td width="60%">&nbsp;</td>
      <td width="40%">
        (Items marked with an &lsquo;O&rsquo; in the above table are
        of the size specified in the <a href="#SizeOfOffsetsV0">Size
          of Offsets</a> field in the superblock.)
    </td></tr>
    <tr>
      <td>&nbsp;</td>
      <td>
        (Items marked with an &lsquo;L&rsquo; in the above table are
        of the size specified in the <a href="#SizeOfLengthsV0">Size
          of Lengths</a> field in the superblock.)
    </td></tr>
  </table>

</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Version 2 B-tree, Type 4 Record Layout - Directly
      Accessed, Filtered, &lsquo;Huge&rsquo; Fractal Heap Objects
    </caption>
	<tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
    </tr>

    <tr>
      <td><p>Filtered Huge Object Address</p></td>
      <td>
        <p>The address of the filtered huge object in the file.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Filtered Huge Object Length</p></td>
      <td>
        <p>The length of the filtered huge object in the file.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Filter Mask</p></td>
      <td>
        <p>A 32-bit bit field indicating which filters have been skipped for
          this chunk.  Each filter has an index number in the pipeline
          (starting at 0, with the first filter to apply) and if that
          filter is skipped, the bit corresponding to its index is set.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Filtered Huge Object Memory Size</p></td>
      <td>
        <p>The size of the de-filtered huge object in memory.
        </p>
      </td>
    </tr>

  </table>
</div>

<br />
<br />
<br />
<div align="center">
  <table class="format">
    <caption>
      Layout: Version 2 B-tree, Type 5 Record Layout - Link Name
      for Indexed Group
    </caption>

    <tr>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
	</tr>

    <tr>
      <td colspan="4">Hash of Name</td>
    </tr>
    <tr>
      <td colspan="4">ID <em>(bytes 1-4)</em></td>
	</tr>

    <tr>
      <td colspan="3">ID <em>(bytes 5-7)</em></td>
	</tr>

  </table>
</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Version 2 B-tree, Type 5 Record Layout - Link Name
      for Indexed Group
    </caption>
	<tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
    </tr>

    <tr>
      <td><p>Hash</p></td>
      <td>
        <p>This field is hash value of the name for the link.  The hash
          value is the Jenkins&rsquo; lookup3 checksum algorithm applied to
          the link&rsquo;s name.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>ID</p></td>
      <td>
        <p>This is a 7-byte sequence of bytes and is the heap ID for the
          link record in the group&rsquo;s fractal heap.</p>
      </td>
    </tr>

  </table>
</div>

<br />
<br />
<br />
<div align="center">
  <table class="format">
    <caption>
      Layout: Version 2 B-tree, Type 6 Record Layout - Creation
      Order for Indexed Group
    </caption>

    <tr>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
    </tr>

    <tr>
      <td colspan="4"><br />Creation Order
        <em>(8 bytes)</em><br /><br /></td>
    </tr>
    <tr>
      <td colspan="4">ID <em>(bytes 1-4)</em></td>
    </tr>
    <tr>
      <td colspan="3">ID <em>(bytes 5-7)</em></td>
    </tr>
  </table>
</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Version 2 B-tree, Type 6 Record Layout - Creation
      Order for Indexed Group
    </caption>
    <tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
    </tr>

    <tr>
      <td><p>Creation Order</p></td>
      <td>
        <p>This field is the creation order value for the link.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>ID</p></td>
      <td>
        <p>This is a 7-byte sequence of bytes and is the heap ID for the
          link record in the group&rsquo;s fractal heap.</p>
      </td>
    </tr>

  </table>
</div>

<br />
<br />
<br />
<div align="center">
  <table class="format">
    <caption>
      Layout: Version 2 B-tree, Type 7 Record Layout - Shared
      Object Header Messages (Sub-type 0 - Message in Heap)
    </caption>

    <tr>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
    </tr>

    <tr>
      <td colspan>Message Location</td>
      <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
    </tr>
    <tr>
      <td colspan="4">Hash</td>
    </tr>
    <tr>
      <td colspan="4">Reference Count</td>
    </tr>
    <tr>
      <td colspan="4"><br />Heap ID <em>(8 bytes)</em><br /><br /></td>
    </tr>
  </table>
</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Version 2 B-tree, Type 7 Record Layout - Shared
      Object Header Messages (Sub-type 0 - Message in Heap)
    </caption>
    <tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
    </tr>

    <tr>
      <td><p>Message Location</p></td>
      <td>
        <p>This field Indicates the location where the message is stored:
          <table class="list">
            <tr>
              <th width="20%" align="center">Value</th>
              <th width="80%" align="left">Description</th>
            </tr>
            <tr>
              <td align="center">0</td>
              <td>Shared message is stored in shared message index heap.
              </td>
            </tr>
            <tr>
              <td align="center">1</td>
              <td>Shared message is stored in object header.
              </td>
            </tr>
        </table></p>
      </td>
    </tr>

    <tr>
      <td><p>Hash</p></td>
      <td>
        <p>This field is hash value of the shared message.  The hash
          value is the Jenkins&rsquo; lookup3 checksum algorithm applied to
          the shared message.</p>
      </td>
    </tr>

    <tr>
      <td><p>Reference Count</p></td>
      <td>
        <p>The number of objects which reference this message.</p>
      </td>
    </tr>

    <tr>
      <td><p>Heap ID</p></td>
      <td>
        <p>This is an 8-byte sequence of bytes and is the heap ID for the
          shared message in the shared message index&rsquo;s fractal heap.</p>
      </td>
    </tr>

  </table>
</div>

<br />
<br />
<br />
<div align="center">
  <table class="format">
    <caption>
      Layout: Version 2 B-tree, Type 7 Record Layout - Shared
      Object Header Messages (Sub-type 1 - Message in Object Header)
    </caption>

    <tr>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
    </tr>

    <tr>
      <td colspan>Message Location</td>
      <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
    </tr>
    <tr>
      <td colspan="4">Hash</td>
    </tr>
    <tr>
      <td>Reserved (zero)</td>
      <td>Message Type</td>
      <td colspan="2">Object Header Index</td>
    </tr>
    <tr>
      <td colspan="4"><br />Object Header Address<sup>O</sup><br /><br /></td>
    </tr>
  </table>

  <table class="note">
    <tr>
      <td width="60%">&nbsp;</td>
      <td width="40%">
        (Items marked with an &lsquo;O&rsquo; in the above table are
        of the size specified in the <a href="#SizeOfOffsetsV0">Size
          of Offsets</a> field in the superblock.)
    </td></tr>
  </table>

</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Version 2 B-tree, Type 7 Record Layout - Shared
      Object Header Messages (Sub-type 1 - Message in Object Header)
    </caption>
    <tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
    </tr>

    <tr>
      <td><p>Message Location</p></td>
      <td>
        <p>This field Indicates the location where the message is stored:
          <table class="list">
            <tr>
              <th width="20%" align="center">Value</th>
              <th width="80%" align="left">Description</th>
            </tr>
            <tr>
              <td align="center">0</td>
              <td>Shared message is stored in shared message index heap.
              </td>
            </tr>
            <tr>
              <td align="center">1</td>
              <td>Shared message is stored in object header.
              </td>
            </tr>
        </table></p>
      </td>
    </tr>

    <tr>
      <td><p>Hash</p></td>
      <td>
        <p>This field is hash value of the shared message.  The hash
          value is the Jenkins&rsquo; lookup3 checksum algorithm applied to
          the shared message.</p>
      </td>
    </tr>

    <tr>
      <td><p>Message Type</p></td>
      <td>
        <p>The object header message type of the shared message.</p>
      </td>
    </tr>

    <tr>
      <td><p>Object Header Index</p></td>
      <td>
        <p>This field indicates that the shared message is the n<sup>th</sup> message
          of its type in the specified object header.</p>
      </td>
    </tr>

    <tr>
      <td><p>Object Header Address</p></td>
      <td>
        <p>The address of the object header containing the shared message.</p>
      </td>
    </tr>

  </table>
</div>

<br />
<br />
<br />
<div align="center">
  <table class="format">
    <caption>
      Layout: Version 2 B-tree, Type 8 Record Layout - Attribute
      Name for Indexed Attributes
    </caption>

    <tr>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
    </tr>

    <tr>
      <td colspan="4"><br />Heap ID <em>(8 bytes)</em><br /><br /></td>
    </tr>
    <tr>
      <td colspan>Message Flags</td>
      <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
    </tr>
    <tr>
      <td colspan="4">Creation Order</td>
    </tr>
    <tr>
      <td colspan="4">Hash of Name</td>
    </tr>
  </table>
</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Version 2 B-tree, Type 8 Record Layout - Attribute
      Name for Indexed Attributes
    </caption>
    <tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
    </tr>

    <tr>
      <td><p>Heap ID</p></td>
      <td>
        <p>This is an 8-byte sequence of bytes and is the heap ID for the
          attribute in the object&rsquo;s attribute fractal heap.</p>
      </td>
    </tr>

    <tr>
      <td><p>Message Flags</p></td>
      <td><p>The object header message flags for the attribute message.</p>
      </td>
    </tr>

    <tr>
      <td><p>Creation Order</p></td>
      <td>
        <p>This field is the creation order value for the attribute.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Hash</p></td>
      <td>
        <p>This field is hash value of the name for the attribute.  The hash
          value is the Jenkins&rsquo; lookup3 checksum algorithm applied to
          the attribute&rsquo;s name.
        </p>
      </td>
    </tr>

  </table>
</div>

<br />
<br />
<br />
<div align="center">
  <table class="format">
    <caption>
      Layout: Version 2 B-tree, Type 9 Record Layout - Creation
      Order for Indexed Attributes
    </caption>

    <tr>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
    </tr>

    <tr>
      <td colspan="4"><br />Heap ID <em>(8 bytes)</em><br /><br /></td>
    </tr>
    <tr>
      <td colspan>Message Flags</td>
      <td colspan="3" bgcolor="#DDDDDD">
        <em>This space inserted only to align table nicely</em></td>
    </tr>
    <tr>
      <td colspan="4">Creation Order</td>
    </tr>
  </table>
</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Version 2 B-tree, Type 9 Record Layout - Creation
      Order for Indexed Attributes
    </caption>
    <tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
    </tr>

    <tr>
      <td><p>Heap ID</p></td>
      <td>
        <p>This is an 8-byte sequence of bytes and is the heap ID for the
          attribute in the object&rsquo;s attribute fractal heap.</p>
      </td>
    </tr>

    <tr>
      <td><p>Message Flags</p></td>
      <td>
        <p>The object header message flags for the attribute message.</p>
      </td>
    </tr>

    <tr>
      <td><p>Creation Order</p></td>
      <td>
        <p>This field is the creation order value for the attribute.
        </p>
      </td>
    </tr>

  </table>
</div>

<br />
<br />
<br />
<a name="V2BtType10"></a>
  <div align="center">
    <table class="format">
      <caption>
        <a name="V2BtreesType10"></a>
          Layout: Version 2 B-tree, Type 10 Record Layout -
          Non-filtered Dataset Chunks
      </caption>

      <tr>
        <th>byte</th>
        <th>byte</th>
        <th>byte</th>
        <th>byte</th>
	  </tr>

	  <tr>
        <td colspan="4"><br />Address<sup>O</sup><br /><br /></td>
	  </tr>

	  <tr>
        <td colspan="4"><br />Dimension 0 Scaled Offset
          <em>(8 bytes)</em><br /><br /></td>
	  </tr>

	  <tr>
        <td colspan="4"><br />Dimension 1 Scaled Offset
          <em>(8 bytes)</em><br /><br /></td>
	  </tr>

	  <tr>
        <td colspan="4"><br />...<br /><br /></td>
	  </tr>

	  <tr>
        <td colspan="4"><br />Dimension #n Scaled Offset
          <em>(8 bytes)</em><br /><br /></td>
	  </tr>

    </table>

    <table class="note">
      <tr>
        <td width="60%">&nbsp;</td>
        <td width="40%">
          (Items marked with an &lsquo;O&rsquo; in the above table are
          of the size specified in the <a href="#SizeOfOffsetsV0">Size
            of Offsets</a> field in the superblock.)
      </td></tr>
    </table>

  </div>

  <br />
  <div align="center">
    <table class="desc">
      <caption>
        Fields: Version 2 B-tree, Type 10 Record Layout -
        Non-filtered Dataset Chunks
</caption>
<tr>
  <th width="30%">Field Name</th>
  <th>Description</th>
</tr>

<tr>
  <td><p>Address</p></td>
  <td>
    <p>This field is the address of the dataset chunk in the file.</p>
  </td>
</tr>

<tr>
  <td><p>Dimension #n Scaled Offset</p></td>
  <td>
    <p>This field is the scaled offset of the chunk within the
      dataset. <em>n</em> is the number of dimensions for the
      dataset. The first scaled offset stored in the list is for
      the slowest changing dimension, and the last scaled offset
      stored is for the fastest changing dimension. Scaled offset
      is calculated by dividing the chunk dimension sizes into
      the chunk offsets.</p>
  </td>
</tr>

</table>
</div>

<br />
<br />
<br />
<div align="center">
  <table class="format">
    <caption>
      <a name="V2BtreesType11"></a>
        Layout: Version 2 B-tree, Type 11 Record Layout - Filtered
        Dataset Chunks
    </caption>

    <tr>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
	</tr>

	<tr>
      <td colspan="4"><br />Address<sup>O</sup><br /><br /></td>
	</tr>

	<tr>
      <td colspan="4"><br />Chunk Size
        <em>(variable size; at most 8 bytes)</em><br /><br /></td>
	</tr>

	<tr>
      <td colspan="4">Filter Mask</td>
	</tr>

	<tr>
      <td colspan="4"><br />Dimension 0 Scaled Offset
        <em>(8 bytes)</em><br /><br /></td>
	</tr>

	<tr>
      <td colspan="4"><br />Dimension 1 Scaled Offset
        <em>(8 bytes)</em><br /><br /></td>
	</tr>

	<tr>
      <td colspan="4"><br />...<br /><br /></td>
	</tr>

	<tr>
      <td colspan="4"><br />Dimension #n Scaled Offset
        <em>(8 bytes)</em><br /><br /></td>
	</tr>

  </table>

  <table class="note">
    <tr>
      <td width="60%">&nbsp;</td>
      <td width="40%">
        (Items marked with an &lsquo;O&rsquo; in the above table are
        of the size specified in the <a href="#SizeOfOffsetsV0">Size
          of Offsets</a> field in the superblock.)
    </td></tr>
  </table>

</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Version 2 B-tree, Type 11 Record Layout - Filtered
      Dataset Chunks
</caption>
<tr>
  <th width="30%">Field Name</th>
  <th>Description</th>
</tr>

<tr>
  <td><p>Address</p></td>
  <td>
    <p>This field is the address of the dataset chunk in the file.</p>
  </td>
</tr>

<tr>
  <td><p>Chunk Size</p></td>
  <td>
    <p>This field is the size of the dataset chunk in bytes.</p>
  </td>
</tr>

<tr>
  <td><p>Filter Mask</p></td>
  <td>
    <p>This field is the filter mask which indicates the filter
	  to skip for the dataset chunk.  Each filter has an index
	  number in the pipeline and if that filter is skipped,
	  the bit corresponding to its index is set.</p>
  </td>
</tr>

<tr>
  <td><p>Dimension #n Scaled Offset</p></td>
  <td>
    <p>This field is the scaled offset of the chunk within
      the dataset. <em>n</em> is the number of dimensions for
      the dataset. The first scaled offset stored in the list
      is for the slowest changing dimension, and the last scaled
      offset stored is for the fastest changing dimension.</p>
  </td>
</tr>

</table>
</div>

<h3><a name="SymbolTable">
    III.B. Disk Format: Level 1B - Group Symbol Table Nodes</a></h3>

<p>A group is an object internal to the file that allows
  arbitrary nesting of objects within the file (including other
  groups). A group maps a set of link names in the group to a set
  of relative file addresses of objects in the file. Certain metadata
  for an object to which the group points can be cached in the
  group&rsquo;s symbol table entry in addition to being in the
  object&rsquo;s header.</p>

<p>An HDF5 object name space can be stored hierarchically by
  partitioning the name into components and storing each
  component as a link in a group.  The link for a
  non-ultimate component points to the group containing
  the next component.  The link for the last
  component points to the object being named.</p>

<p>One implementation of a  group is a collection of symbol table
  nodes indexed by a B-tree. Each symbol table node contains entries
  for one or more links. If an attempt is made to add a link to an
  already full symbol table node containing 2<em>K</em> entries, then
  the node is split and one node contains <em>K</em> symbols and the
  other contains <em>K</em>+1 symbols.</p>

<div align="center">
  <table class="format">
    <caption>
      Layout: Symbol Table Node (A Leaf of a B-tree)
    </caption>

    <tr>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
    </tr>

    <tr>
      <td colspan="4">Signature</td>
    </tr>

    <tr>
      <td>Version Number</td>
      <td>Reserved <em>(zero)</em></td>
      <td colspan="2">Number of Symbols</td>
    </tr>

    <tr>
      <td colspan="4"><br /><br />Group Entries<br /><br /><br /></td>
    </tr>
  </table>
</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Symbol Table Node (A Leaf of a B-tree)
    </caption>
    <tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
    </tr>

    <tr>
      <td><p>Signature</p></td>
      <td>
        <p>The ASCII character string &ldquo;<code>SNOD</code>&rdquo; is
          used to indicate the
          beginning of a symbol table node.  This gives file
          consistency checking utilities a better chance of
          reconstructing a damaged file.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Version Number</p></td>
      <td>
        <p>The version number for the symbol table node.  This
          document describes version 1. (There is no version &lsquo;0&rsquo;
          of the symbol table node)
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Number of Entries</p></td>
      <td>
        <p>Although all symbol table nodes have the same length,
          most contain fewer than the maximum possible number of
          link entries.  This field indicates how many entries
          contain valid data.  The valid entries are packed at the
          beginning of the symbol table node while the remaining
          entries contain undefined values.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Symbol Table Entries</p></td>
      <td>
        <p>Each link has an entry in the symbol table node.
          The format of the entry is described below.
          There are 2<em>K</em> entries in each group node, where
          <em>K</em> is the &ldquo;Group Leaf Node K&rdquo; value from the
          <a href="#Superblock">superblock</a>.
        </p>
      </td>
    </tr>
  </table>
</div>

<h3><a name="SymbolTableEntry">
    III.C. Disk Format: Level 1C - Symbol Table Entry </a></h3>

<p>Each symbol table entry in a symbol table node is designed
  to allow for very fast browsing of stored objects.
  Toward that design goal, the symbol table entries
  include space for caching certain constant metadata from the
  object header.</p>

<div align="center">
  <table class="format">
    <caption>
      Layout: Symbol Table Entry
    </caption>

    <tr>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
    </tr>

    <tr>
      <td colspan="4"><br />Link Name Offset<sup>O</sup><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4"><br />Object Header Address<sup>O</sup><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4">Cache Type</td>
    </tr>

    <tr>
      <td colspan="4">Reserved <em>(zero)</em></td>
    </tr>

    <tr>
      <td colspan="4"><br /><br />Scratch-pad Space
        <em>(16 bytes)</em><br /><br /><br /></td>
    </tr>
  </table>

  <table class="note">
    <tr>
      <td width="60%">&nbsp;</td>
      <td width="40%">
        (Items marked with an &lsquo;O&rsquo; in the above table are
        of the size specified in the <a href="#SizeOfOffsetsV0">Size
          of Offsets</a> field in the superblock.)
    </td></tr>
  </table>

</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Symbol Table Entry
    </caption>
    <tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
    </tr>

    <tr>
      <td><p>Link Name Offset</p></td>
      <td>
        <p>This is the byte offset into the group&rsquo;s local
          heap for the name of the link. The name is null
          terminated.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Object Header Address</p></td>
      <td>
        <p>Every object has an object header which serves as a
          permanent location for the object&rsquo;s metadata.  In addition
          to appearing in the object header, some of the object&rsquo;s metadata
          can be cached in the scratch-pad space.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Cache Type</p></td>
      <td>
        <p>The cache type is determined from the object header.
          It also determines the format for the scratch-pad space:

          <table class="list">
            <tr>
              <th width="20%" align="center">Type</th>
              <th width="80%" align="left">Description</th>
            </tr>
            <tr>
              <td align="center">0</td>
              <td>No data is cached by the group entry.  This
                is guaranteed to be the case when an object header
                has a link count greater than one.
              </td>
            </tr>
            <tr>
              <td align="center">1</td>
              <td>Group object header metadata is cached in the
                scratch-pad space.  This implies that the symbol table
                entry refers to another group.
              </td>
            </tr>
            <tr>
              <td align="center">2</td>
              <td>The entry is a symbolic link.  The first four bytes
                of the scratch-pad space are the offset into the local
                heap for the link value.  The object header address
                will be undefined.
              </td>
            </tr>
        </table></p>

      </td>
    </tr>

    <tr>
      <td><p>Reserved</p></td>
      <td>
        <p>These four bytes are present so that the scratch-pad
          space is aligned on an eight-byte boundary.  They are
          always set to zero.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Scratch-pad Space</p></td>
      <td>
        <p>This space is used for different purposes, depending
          on the value of the Cache Type field. Any metadata
          about an object represented in the scratch-pad
          space is duplicated in the object header for that
          object.
        </p>
        <p>
          Furthermore, no data is cached in the group
          entry scratch-pad space if the object header for
          the object has a link count greater than one.
        </p>
      </td>
    </tr>
  </table>
</div>

<h4>Format of the Scratch-pad Space</h4>

<p>The symbol table entry scratch-pad space is formatted
  according to the value in the Cache Type field.</p>

<p>If the Cache Type field contains the value zero
  <code>(0)</code> then no information is
  stored in the scratch-pad space.</p>

<p>If the Cache Type field contains the value one
  <code>(1)</code>, then the scratch-pad space
  contains cached metadata for another object header
  in the following format:</p>

<div align="center">
  <table class="format">
    <caption>
      Layout: Object Header Scratch-pad Format
    </caption>

    <tr>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
    </tr>

    <tr>
      <td colspan="4"><br />Address of B-tree<sup>O</sup><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4"><br />Address of Name Heap<sup>O</sup><br /><br /></td>
    </tr>
  </table>

  <table class="note">
    <tr>
      <td width="60%">&nbsp;</td>
      <td width="40%">
        (Items marked with an &lsquo;O&rsquo; in the above table are
        of the size specified in the <a href="#SizeOfOffsetsV0">Size
          of Offsets</a> field in the superblock.)
    </td></tr>
  </table>

</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Object Header Scratch-pad Format
    </caption>
    <tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
    </tr>

    <tr>
      <td><p>Address of B-tree</p></td>
      <td>
        <p>This is the file address for the root of the
          group&rsquo;s B-tree.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Address of Name Heap</p></td>
      <td>
        <p>This is the file address for the group&rsquo;s local
          heap, in which are stored the group&rsquo;s symbol names.
        </p>
      </td>
    </tr>
  </table>
</div>


<br />
<br />
<br />
<p>If the Cache Type field contains the value two
  <code>(2)</code>, then the scratch-pad space
  contains cached metadata for a symbolic link
  in the following format:</p>

<div align="center">
  <table class="format">
    <caption>
      Layout: Symbolic Link Scratch-pad Format
    </caption>

    <tr>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
    </tr>

    <tr>
      <td colspan="4">Offset to Link Value</td>
    </tr>
  </table>
</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Symbolic Link Scratch-pad Format
    </caption>
    <tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
    </tr>

    <tr>
      <td><p>Offset to Link Value</p></td>
      <td>
        <p>The value of a symbolic link (that is, the name of the
          thing to which it points) is stored in the local heap.
          This field is the 4-byte offset into the local heap for
          the start of the link value, which is null terminated.
        </p>
      </td>
    </tr>
  </table>
</div>

<h3><a name="LocalHeap">
    III.D. Disk Format: Level 1D - Local Heaps</a></h3>

<p>A local heap is a collection of small pieces of data that are particular
  to a single object in the HDF5 file.  Objects can be
  inserted and removed from the heap at any time.
  The address of a heap does not change once the heap is created.
  For example, a group stores addresses of objects in symbol table nodes
  with the names of links stored in the group&rsquo;s local heap.
</p>

<div align="center">
  <table class="format">
    <caption>
      Layout: Local Heap
    </caption>

    <tr>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
    </tr>

    <tr>
      <td colspan="4">Signature</td>
    </tr>

    <tr>
      <td>Version</td>
      <td colspan="3">Reserved <em>(zero)</em></td>
    </tr>

    <tr>
      <td colspan="4"><br />Data Segment Size<sup>L</sup><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4"><br />Offset to Head of Free-list<sup>L</sup><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4"><br />Address of Data Segment<sup>O</sup><br /><br /></td>
    </tr>
  </table>

  <table class="note">
    <tr>
      <td width="60%">&nbsp;</td>
      <td width="40%">
        (Items marked with an &lsquo;L&rsquo; in the above table are
        of the size specified in the <a href="#SizeOfLengthsV0">Size
          of Lengths</a> field in the superblock.)
    </td></tr>
    <tr>
      <td>&nbsp;</td>
      <td>
        (Items marked with an &lsquo;O&rsquo; in the above table are
        of the size specified in the <a href="#SizeOfOffsetsV0">Size
          of Offsets</a> field in the superblock.)
    </td></tr>
  </table>

</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Local Heap
    </caption>
    <tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
    </tr>

    <tr>
      <td><p>Signature</p></td>
      <td>
        <p>The ASCII character string &ldquo;<code>HEAP</code>&rdquo;
          is used to indicate the
          beginning of a heap.  This gives file consistency
          checking utilities a better chance of reconstructing a
          damaged file.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Version</p></td>
      <td>
        <p>Each local heap has its own version number so that new
          heaps can be added to old files.  This document
          describes version zero (0) of the local heap.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Data Segment Size</p></td>
      <td>
        <p>The total amount of disk memory allocated for the heap
          data.  This may be larger than the amount of space
          required by the objects stored in the heap.  The extra
          unused space in the heap holds a linked list of free blocks.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Offset to Head of Free-list</p></td>
      <td>
        <p>This is the offset within the heap data segment of the
          first free block (or the
          <a href="#UndefinedAddress">undefined address</a> if there is no
          free block).  The free block contains
          <a href="#SizeOfLengthsV0">Size of Lengths</a> bytes that
          are the offset of the next free block (or the
          value &lsquo;1&rsquo; if this is the
          last free block) followed by Size of Lengths bytes that store
          the size of this free block.  The size of the free block includes
          the space used to store the offset of the next free block and
          the size of the current block, making the minimum size of a free
          block 2 * Size of Lengths.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Address of Data Segment</p></td>
      <td>
        <p>The data segment originally starts immediately after
          the heap header, but if the data segment must grow as a
          result of adding more objects, then the data segment may
          be relocated, in its entirety, to another part of the
          file.
        </p>
      </td>
    </tr>
  </table>
</div>

<p>Objects within a local heap should be aligned on an 8-byte boundary.</p>

<h3><a name="GlobalHeap">
    III.E. Disk Format: Level 1E - Global Heap</a></h3>

<p>Each HDF5 file has a global heap which stores various types of
  information which is typically shared between datasets.  The
  global heap was designed to satisfy these goals:</p>

<ol type="A">
  <li>Repeated access to a heap object must be efficient without
    resulting in repeated file I/O requests. Since global heap
    objects will typically be shared among several datasets, it is
    probable that the object will be accessed repeatedly.</li>
  <li>Collections of related global heap objects should result in
    fewer and larger I/O requests.  For instance, a dataset of
    object references will have a global heap object for each
    reference.  Reading the entire set of object references
    should result in a few large I/O requests instead of one small
    I/O request for each reference.</li>
  <li>It should be possible to remove objects from the global heap
    and the resulting file hole should be eligible to be reclaimed
    for other uses.</li>
</ol>


<p>The implementation of the heap makes use of the memory management
  already available at the file level and combines that with a new
  object called a <em>collection</em> to achieve goal B. The global heap
  is the set of all collections.  Each global heap object belongs to
  exactly one collection, and each collection contains one or more global
  heap objects. For the purposes of disk I/O and caching, a collection is
  treated as an atomic object, addressing goal A.
</p>

<p>When a global heap object is deleted from a collection (which
  occurs when its reference count falls to zero), objects located
  after the deleted object in the collection are packed down toward
  the beginning of the collection, and the collection&rsquo;s
  global heap object 0 is created (if possible), or its size is
  increased to account for the recently freed space. There are
  no gaps between objects in each collection, with the possible
  exception of the final space in the collection, if it is not
  large enough to hold the header for the collection&rsquo;s
  global heap object 0. These features address goal C.
</p>

<p>The HDF5 Library creates global heap collections as needed, so there may
  be multiple collections throughout the file. The set of all of them is
  abstractly called the &ldquo;global heap&rdquo;, although they do not actually link
  to each other, and there is no global place in the file where you can
  discover all of the collections.  The collections are found simply by
  finding a reference to one through another object in the file.  For
  example, data of variable-length datatype elements is stored in the
  global heap and is accessed via a global heap ID.  The format for
  global heap IDs is described at the end of this section.
</p>

<p>For more information on global heaps for virtual datasets, see
  <a href="#GlobalHeapVDS">&ldquo;Disk Format: Level 1F - Global Heap
    Block for Virtual Datasets.&rdquo;</a></p>
<br />

<div align="center">
  <table class="format">
    <caption>
      Layout: A Global Heap Collection
    </caption>

    <tr>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
    </tr>

    <tr>
      <td colspan="4">Signature</td>
    </tr>

    <tr>
      <td>Version</td>
      <td colspan="3">Reserved (zero)</td>
    </tr>

    <tr>
      <td colspan="4"><br />Collection Size<sup>L</sup><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4"><br />Global Heap Object 1<br /><br /></td>
    </tr>

    <tr>
      <td colspan="4"><br />Global Heap Object 2<br /><br /></td>
    </tr>

    <tr>
      <td colspan="4"><br />...<br /><br /></td>
    </tr>

    <tr>
      <td colspan="4"><br />Global Heap Object <em>N</em><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4"><br />Global Heap Object 0 (free space)<br /><br /></td>
    </tr>
  </table>

  <table class="note">
    <tr>
      <td width="60%">&nbsp;</td>
      <td width="40%">
        (Items marked with an &lsquo;L&rsquo; in the above table are
        of the size specified in the <a href="#SizeOfLengthsV0">Size
          of Lengths</a> field in the superblock.)
    </td></tr>
  </table>

</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: A Global Heap Collection
    </caption>
    <tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
    </tr>

    <tr>
      <td><p>Signature</p></td>
      <td>
        <p>The ASCII character string &ldquo;<code>GCOL</code>&rdquo;
          is used to indicate the
          beginning of a collection.  This gives file consistency
          checking utilities a better chance of reconstructing a
          damaged file.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Version</p></td>
      <td>
        <p>Each collection has its own version number so that new
          collections can be added to old files.  This document
          describes version one (1) of the collections (there is no
          version zero (0)).
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Collection Size</p></td>
      <td>
        <p>This is the size in bytes of the entire collection
          including this field.  The default (and minimum)
          collection size is 4096 bytes which is a typical file
          system block size.  This allows for 127 16-byte heap
          objects plus their overhead (the collection header of 16 bytes
          and the 16 bytes of information about each heap object).
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Global Heap Object 1 through <em>N</em></p></td>
      <td>
        <p>The objects are stored in any order with no
          intervening unused space.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Global Heap Object 0</p></td>
      <td>
        <p>Global Heap Object 0 (zero), when present, represents the free
          space in the collection.  Free space always appears at the end of
          the collection.  If the free space is too small to store the header
          for Object 0 (described below) then the header is implied and is not
          written.
        <p>
          The field <em>Object Size</em> for Object 0 indicates the
          amount of possible free space in the collection including the 16-byte
          header size of Object 0.
        </p>
      </td>
    </tr>
  </table>
</div>

<br />
<br />
<br />
<div align="center">
  <table class="format">
    <caption>
      Layout: Global Heap Object
    </caption>

    <tr>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
    </tr>

    <tr>
      <td colspan="2">Heap Object Index</td>
      <td colspan="2">Reference Count</td>
    </tr>

    <tr>
      <td colspan="4">Reserved (zero)</td>
    </tr>

    <tr>
      <td colspan="4"><br />Object Size<sup>L</sup><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4"><br />Object Data<br /><br /></td>
    </tr>
  </table>

  <table class="note">
    <tr>
      <td width="60%">&nbsp;</td>
      <td width="40%">
        (Items marked with an &lsquo;L&rsquo; in the above table are
        of the size specified in the <a href="#SizeOfLengthsV0">Size
          of Lengths</a> field in the superblock.)
    </td></tr>
  </table>

</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Global Heap Object
    </caption>
    <tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
    </tr>

    <tr>
      <td><p>Heap Object Index</p></td>
      <td>
        <p>Each object has a unique identification number within a
          collection.  The identification numbers are chosen so that
          new objects have the smallest value possible with the
          exception that the identifier <code>0</code> always refers to the
          object which represents all free space within the
          collection.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Reference Count</p></td>
      <td>
        <p>All heap objects have a reference count field.  An
          object which is referenced from some other part of the
          file will have a positive reference count. The reference
          count for Object 0 is always zero.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Reserved</p></td>
      <td>
        <p>Zero padding to align next field on an 8-byte boundary.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Object Size</p></td>
      <td>
        <p>This is the size of the object data stored for the object.
          The actual storage space allocated for the object data is rounded
          up to a multiple of eight.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Object Data</p></td>
      <td>
        <p>The object data is treated as a one-dimensional array
          of bytes to be interpreted by the caller.
        </p>
      </td>
    </tr>
  </table>

</div>

<br />
<br />
<br />
<p>
  <a name="GlobalHeapID"></a>
    The format for the ID used to locate an object in the global heap is
    described here:</p>

<div align="center">
  <table class="format">
    <caption>
      Layout: Global Heap ID
    </caption>

    <tr>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
    </tr>

    <tr>
      <td colspan="4"><br />Collection Address<sup>O</sup><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4">Object Index</td>
    </tr>
  </table>

  <table class="note">
    <tr>
      <td width="60%">&nbsp;</td>
      <td width="40%">
        (Items marked with an &lsquo;O&rsquo; in the above table are
        of the size specified in the <a href="#SizeOfOffsetsV0">Size
          of Offsets</a> field in the superblock.)
    </td></tr>
  </table>

</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Global Heap ID
    </caption>
    <tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
    </tr>

    <tr>
      <td><p>Collection Address</p></td>
      <td>
        <p>This field is the address of the global heap collection
		  where the data object is stored.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>ID</p></td>
      <td>
        <p>This field is the index of the data object within the
		  global heap collection.
        </p>
      </td>
    </tr>

  </table>
</div>



<h3><a name="GlobalHeapVDS"> III.F. Disk Format: Level 1F - Global
    Heap Block for Virtual Datasets</a></h3>

<p>The layout for the global heap block used with virtual datasets is
  described below. For more information on global heaps, see
  <a href="#GlobalHeap"></a>&ldquo;Disk Format: Level 1E - Global Heap.&rdquo;</p>

<br />
<div align="center">
  <table class="format">
    <caption>
      Layout: Global Heap Block for Virtual Dataset
    </caption>

    <tr>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
    </tr>

    <tr>
      <td>Version</td>
      <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
          only to align table nicely</em></td>
    </tr>

    <tr>
      <td colspan="4"><br />Num Entries<sup>L</sup><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4"><br />Source Filename #1 <em>(variable size)</em><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4"><br />Source Dataset #1 <em>(variable
          size)</em><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4"><br />Source Selection #1 <em>(variable
          size)</em><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4"><br />Virtual Selection #1 <em>(variable
          size)</em><br /><br /></td>
    </tr>

	<tr>
	  <td colspan="4">.<br />.<br />.<br /></td>
	</tr>

    <tr>
      <td colspan="4"><br />Source Filename #n <em>(variable
          size)</em><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4"><br />Source Dataset #n <em>(variable
          size)</em><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4"><br />Source Selection #n <em>(variable
          size)</em><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4"><br />Virtual Selection #n <em>(variable
          size)</em><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4">Checksum</td>
    </tr>

  </table>

  <table class="note">
    <tr>
      <td width="60%">&nbsp;</td>
      <td width="40%">
        (Items marked with an &lsquo;L&rsquo; in the above table are
        of the size specified in the <a href="#SizeOfLengthsV0">Size
          of Lengths</a> field in the superblock.)
    </td></tr>
  </table>

</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Global Heap Block for Virtual Dataset
    </caption>
	<tr>
      <th width="40%">Field Name</th>
      <th>Description</th>
    </tr>

    <tr>
      <td><p>Version</p></td>
      <td>
        <p>The version number for the block; the value is 0.</p>
      </td>
    </tr>

	<tr>
      <td><p>Num Entries</p></td>
      <td><p>The number of entries in the block.</p>
      </td>
    </tr>

    <tr>
      <td><p>Source Filename #n</p></td>
	  <td>
	    <p>The source file name where the source dataset is located.
        </p>
	  </td>
    </tr>

	<tr>
	  <td><p>Source Dataset #n</p></td>
	  <td><p>The source dataset name that is mapped to the
          virtual dataset.</p></td>
	</tr>

	<tr>
	  <td><p>Source Selection #n</p></td>
	  <td>
	    <p>The <a href="#DataspaceSEL">dataspace selection</a> in the
          source dataset that is mapped to the virtual selection.
	    </p>
	  </td>
	</tr>

	<tr>
	  <td><p>Virtual Selection #n</p></td>
	  <td>
	    <p>This is the <a href="#DataspaceSEL">dataspace selection</a> in the virtual dataset that is
		  mapped to the source selection.
	    </p>
	  </td>
	</tr>

    <tr>
      <td><p>Checksum</p></td>
      <td>
        <p>This is the checksum for the block.</p>
      </td>
    </tr>

  </table>
</div>
<br>

<h3><a name="FractalHeap">
    III.G. Disk Format: Level 1G - Fractal Heap</a></h3>

<p>
  Each fractal heap consists of a header and zero or more direct and
  indirect blocks (described below).  The header contains general
  information as well as
  initialization parameters for the doubling table.  The <em>Address
    of Root Block</em> field in the header points to the first direct or
  indirect block in the heap.
</p>

<p>
  Fractal heaps are based on a data structure called a <em>doubling
    table</em>.  A doubling table provides a mechanism for quickly
  extending an array-like data structure that minimizes the number of
  empty blocks in the heap, while retaining very fast lookup of any
  element within the array.  More information on fractal heaps and
  doubling tables can be found in the RFC
  &ldquo;<a href="Supplements/FractalHeap/PrivateHeap.pdf">Private
    Heaps in HDF5</a>.&rdquo;
</p>

<p>
  The fractal heap implements the doubling table structure with
  indirect and direct blocks.
  Indirect blocks in the heap do not actually contain data for
  objects in the heap, their &ldquo;size&rdquo; is abstract -
  they represent the indexing structure for locating the
  direct blocks in the doubling table.
  Direct blocks
  contain the actual data for objects stored in the heap.
</p>

<p>
  All indirect blocks have a constant number of block entries in each
  row, called the <em>width</em> of the doubling table
  (see <em>Table Width</em> field in the header).

  The number
  of rows for each indirect block in the heap is determined by the
  size of the block that the indirect block represents in the
  doubling table (calculation of this is shown below) and is
  constant, except for the &ldquo;root&rdquo;
  indirect block, which expands and shrinks its number of rows as
  needed.
</p>

<p>
  Blocks in the first <em>two</em> rows of an indirect block
  are <em>Starting Block Size</em> number of bytes in size.
  For example, if the row <em>width</em> of the doubling table is 4,
  then the first eight block entries in the
  indirect block are <em>Starting Block Size</em> number of bytes in size.
  The blocks in each subsequent row are twice the size of
  the blocks in the previous row. In other words, blocks in
  the third row are twice the <em>Starting Block Size</em>,
  blocks in the fourth row are four times the
  <em>Starting Block Size</em>, and so on.  Entries for
  blocks up to the <em>Maximum Direct Block Size</em> point to
  direct blocks, and entries for blocks greater than that size
  point to further indirect blocks (which have their own
  entries for direct and indirect blocks).
  <em>Starting Block Size</em> and
  <em>Maximum Direct Block Size</em> are fields
  stored in the header.
</p>

<p>
  The number of rows of blocks, <em>nrows</em>, in an
  indirect block is calculated by the following expression:
  <br /> <br />
  <em>nrows</em> = (log<sub>2</sub>(<em>block_size</em>) -
  log<sub>2</sub>(<em>&lt;Starting Block Size&gt;</em>)) + 1
</p>
where <em>block_size</em> is the size of the block that the indirect block
represents in the doubling table.
For example, to represent a block with <em>block_size</em> equals to 1024,
and <em>Starting Block Size</em> equals to 256,
three rows are needed.
<p>
  The maximum number of rows of direct blocks, <em>max_dblock_rows</em>,
  in any indirect block of a fractal heap is given by the
  following expression:
  <br /> <br />
  <em>max_dblock_rows</em> =
  (log<sub>2</sub>(<em>&lt;Maximum Direct Block Size&gt;</em>) -
  log<sub>2</sub>(<em>&lt;Starting Block Size&gt;</em>)) + 2
</p>
<p>
  Using the computed values for <em>nrows</em> and
  <em>max_dblock_rows</em>, along with the <em>width</em> of the
  doubling table, the number of direct and indirect block entries
  (<em>K</em> and <em>N</em> in the indirect block description, below)
  in an indirect block can be computed:
  <br /> <br />
  <em>K</em> = MIN(<em>nrows</em>, <em>max_dblock_rows</em>) *
  <em>&lt;Table Width&gt;</em>

  <br /> <br />
  If <em>nrows</em> is less than or equal to <em>max_dblock_rows</em>,
  <em>N</em> is 0.  Otherwise, <em>N</em> is simply computed:
  <br /> <br />
  <em>N</em> = <em>K</em> - (<em>max_dblock_rows</em> *
  <em>&lt;Table Width&gt;</em>)
</p>

<p>
  The size of indirect blocks on disk is determined by the number
  of rows in the indirect block (computed above).  The size of direct
  blocks on disk is exactly the size of the block in the doubling
  table.
</p>
<br>

<div align="center">
  <table class="format">
    <caption>
      Layout: Fractal Heap Header
    </caption>

    <tr>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
    </tr>

    <tr>
      <td colspan="4">Signature</td>
    </tr>

    <tr>
      <td>Version</td>
      <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
    </tr>

    <tr>
      <td colspan="2">Heap ID Length</td>
      <td colspan="2">I/O Filters&rsquo; Encoded Length</td>
    </tr>

    <tr>
      <td>Flags</td>
      <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
    </tr>

    <tr>
      <td colspan="4">Maximum Size of Managed Objects</td>
    </tr>

    <tr>
      <td colspan="4"><br />Next Huge Object ID<sup>L</sup><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4"><br />v2 B-tree Address of Huge Objects<sup>O</sup><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4"><br />Amount of Free Space in Managed Blocks<sup>L</sup><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4"><br />Address of Managed Block Free Space Manager<sup>O</sup><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4"><br />Amount of Managed Space in Heap<sup>L</sup><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4"><br />Amount of Allocated Managed Space in Heap<sup>L</sup><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4"><br />Offset of Direct Block Allocation Iterator in Managed Space<sup>L</sup><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4"><br />Number of Managed Objects in Heap<sup>L</sup><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4"><br />Size of Huge Objects in Heap<sup>L</sup><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4"><br />Number of Huge Objects in Heap<sup>L</sup><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4"><br />Size of Tiny Objects in Heap<sup>L</sup><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4"><br />Number of Tiny Objects in Heap<sup>L</sup><br /><br /></td>
    </tr>

    <tr>
      <td colspan="2">Table Width</td>
      <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
    </tr>

    <tr>
      <td colspan="4"><br />Starting Block Size<sup>L</sup><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4"><br />Maximum Direct Block Size<sup>L</sup><br /><br /></td>
    </tr>

    <tr>
      <td colspan="2">Maximum Heap Size</td>
      <td colspan="2">Starting # of Rows in Root Indirect Block</td>
    </tr>

    <tr>
      <td colspan="4"><br />Address of Root Block<sup>O</sup><br /><br /></td>
    </tr>

    <tr>
      <td colspan="2">Current # of Rows in Root Indirect Block</td>
      <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
    </tr>

    <tr>
      <td colspan="4"><br />Size of Filtered Root Direct Block <em>(optional)</em><sup>L</sup><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4">I/O Filter Mask<em> (optional)</em></td>
    </tr>

    <tr>
      <td colspan="4">I/O Filter Information<em> (optional, variable size)</em></td>
    </tr>

    <tr>
      <td colspan="4">Checksum</td>
    </tr>

  </table>

  <table class="note">
    <tr>
      <td width="60%">&nbsp;</td>
      <td width="40%">
        (Items marked with an &lsquo;L&rsquo; in the above table are
        of the size specified in the <a href="#SizeOfLengthsV0">Size
          of Lengths</a> field in the superblock.)
    </td></tr>
    <tr>
      <td>&nbsp;</td>
      <td>
        (Items marked with an &lsquo;O&rsquo; in the above table are
        of the size specified in the <a href="#SizeOfOffsetsV0">Size
          of Offsets</a> field in the superblock.)
    </td></tr>
  </table>

</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Fractal Heap Header
    </caption>
    <tr>
      <th width="40%">Field Name</th>
      <th>Description</th>
    </tr>

    <tr>
      <td><p>Signature</p></td>
      <td>
        <p>The ASCII character string &ldquo;<code>FRHP</code>&rdquo;
          is used to indicate the
          beginning of a fractal heap header.  This gives file consistency
          checking utilities a better chance of reconstructing a
          damaged file.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Version</p></td>
      <td>
        <p>This document describes version 0.</p>
      </td>
    </tr>

    <tr>
      <td><p>Heap ID Length</p></td>
      <td>
        <p>This is the length in bytes of heap object IDs for this heap.</p>
      </td>
    </tr>

    <tr>
      <td><p>I/O Filters&rsquo; Encoded Length</p></td>
      <td>
	    <p>This is the size in bytes of the encoded <em>I/O Filter Information</em>.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Flags</p></td>
      <td>
        <p>This field is the heap status flag and is a bit field
          indicating additional information about the fractal heap.
          <table class="list">
            <tr>
              <th width="20%" align="center">Bit(s)</th>
              <th width="80%" align="left">Description</th>
            </tr>

            <tr>
              <td align="center"><code>0</code></td>
              <td>If set, the ID value to use for huge object has wrapped
                around.  If the value for the <em>Next Huge Object ID</em>
                has wrapped around, each new huge object inserted into the
                heap will require a search for an ID value.
              </td>
            </tr>
            <tr>
              <td align="center"><code>1</code></td>
              <td>If set, the direct blocks in the heap are checksummed.
              </td>
            </tr>
            <tr>
              <td align="center"><code>2-7</code></td>
              <td>Reserved</td>
            </tr>
        </table></p>

      </td>
    </tr>

    <tr>
      <td><p>Maximum Size of Managed Objects</p></td>
      <td>
	    <p>This is the maximum size of managed objects allowed in the heap.
          Objects greater than this this are &lsquo;huge&rsquo; objects and will be
          stored in the file directly, rather than in a direct block for
          the heap.
	    </p>
      </td>
    </tr>

    <tr>
      <td><p>Next Huge Object ID</p></td>
      <td>
	    <p>This is the next ID value to use for a huge object in the heap.
	    </p>
      </td>
    </tr>

    <tr>
      <td><p>v2 B-tree Address of Huge Objects</p></td>
      <td>
	    <p>This is the address of the <a href="#V2Btrees">v2 B-tree</a>
          used to track huge objects in the heap.  The type of records
          stored in the <em>v2 B-tree</em> will
          be determined by whether the address and length of a huge object
          can fit into a heap ID (if yes, it is a &ldquo;directly&rdquo; accessed
          huge object) and whether there is a filter used on objects
          in the heap.
	    </p>
      </td>
    </tr>

    <tr>
      <td><p>Amount of Free Space in Managed Blocks</p></td>
      <td>
	    <p>This is the total amount of free space in managed direct blocks
          (in bytes).
	    </p>
      </td>
    </tr>

    <tr>
      <td><p>Address of Managed Block Free Space Manager</p></td>
      <td>
	    <p>This is the address of the
          <em><a href="#FreeSpaceManager">Free-space Manager</a></em> for
          managed blocks.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Amount of Managed Space in Heap</p></td>
	  <td>
	    <p>This is the total amount of managed space in the heap (in bytes),
          essentially the upper bound of the heap&rsquo;s linear address space.
	    </p>
      </td>
    </tr>

	<tr>
      <td><p>Amount of Allocated Managed Space in Heap</p></td>
	  <td>
	    <p>This is the total amount of managed space (in bytes) actually
          allocated in
          the heap.  This can be less than the <em>Amount of Managed Space
            in Heap</em> field, if some direct blocks in the heap&rsquo;s linear
          address space are not allocated.
	    </p>
	  </td>
	</tr>

	<tr>
      <td><p>Offset of Direct Block Allocation Iterator in Managed Space</p></td>
	  <td>
	    <p>This is the linear heap offset where the next direct
          block should be allocated at (in bytes).  This may be less than
          the <em>Amount of Managed Space in Heap</em> value because the
          heap&rsquo;s address space is increased by a &ldquo;row&rdquo; of direct blocks
          at a time, rather than by single direct block increments.
	    </p>
	  </td>
	</tr>

	<tr>
      <td><p>Number of Managed Objects in Heap</p></td>
	  <td>
	    <p>This is the number of managed objects in the heap.
	    </p>
	  </td>
	</tr>

	<tr>
      <td><p>Size of Huge Objects in Heap</p></td>
	  <td>
	    <p>This is the total size of huge objects in the heap (in bytes).
	    </p>
	  </td>
	</tr>

	<tr>
      <td><p>Number of Huge Objects in Heap</p></td>
	  <td>
	    <p>This is the number of huge objects in the heap.
	    </p>
	  </td>
	</tr>

	<tr>
      <td><p>Size of Tiny Objects in Heap</p></td>
	  <td>
	    <p>This is the total size of tiny objects that are packed in heap
          IDs (in bytes).
	    </p>
	  </td>
	</tr>

	<tr>
      <td><p>Number of Tiny Objects in Heap</p></td>
	  <td>
	    <p>This is the number of tiny objects that are packed in heap IDs.
	    </p>
	  </td>
	</tr>

	<tr>
      <td><p>Table Width</p></td>
	  <td>
	    <p>This is the number of columns in the doubling table for managed
          blocks.  This value must be a power of two.
	    </p>
	  </td>
	</tr>

	<tr>
      <td><p>Starting Block Size</p></td>
	  <td>
	    <p>This is the starting block size to use in the doubling table for
	      managed blocks (in bytes).  This value must be a power of two.
	    </p>
	  </td>
	</tr>

	<tr>
      <td><p>Maximum Direct Block Size</p></td>
	  <td>
	    <p>This is the maximum size allowed for a managed direct block.
          Objects inserted into the heap that are larger than this value
          (less the number of bytes of direct block prefix/suffix)
          are stored as &lsquo;huge&rsquo; objects.  This value must be a power of
          two.
	    </p>
	  </td>
	</tr>

	<tr>
      <td><p>Maximum Heap Size</p></td>
	  <td>
	    <p>This is the maximum size of the heap&rsquo;s linear address space for
          managed objects (in bytes).  The value stored is the log2 of
          the actual value, that is: the number of bits of the address space.
          &lsquo;Huge&rsquo; and &lsquo;tiny&rsquo; objects are not counted in this value, since
          they do not store objects in the linear address space of the
          heap.
	    </p>
	  </td>
	</tr>

	<tr>
      <td><p>Starting # of Rows in Root Indirect Block</p></td>
	  <td>
	    <p>This is the starting number of rows for the root indirect block.
	      A value of 0 indicates that the root indirect block will have
          the maximum number of rows needed to address the heap&rsquo;s <em>Maximum
            Heap Size</em>.
	    </p>
	  </td>
	</tr>

	<tr>
      <td><p>Address of Root Block</p></td>
	  <td>
	    <p>This is the address of the root block for the heap.  It can
          be the <a href="#UndefinedAddress">undefined address</a> if
          there is no data in the heap.  It either points to a direct
          block (if the <em>Current # of Rows in the Root Indirect
            Block</em> value is 0), or an indirect block.
	    </p>
	  </td>
	</tr>

	<tr>
      <td><p>Current # of Rows in Root Indirect Block</p></td>
	  <td>
	    <p>This is the current number of rows in the root indirect block.
		  A value of 0 indicates that <em>Address of Root Block</em>
          points to direct block instead of indirect block.
	    </p>
	  </td>
	</tr>

	<tr>
      <td><p>Size of Filtered Root Direct Block</p></td>
	  <td>
	    <p>This is the size of the root direct block, if filters are
          applied to heap objects (in bytes).  This field is only
          stored in the header if the <em>I/O Filters&rsquo; Encoded Length</em>
          is greater than 0.
	    </p>
	  </td>
	</tr>

	<tr>
      <td><p>I/O Filter Mask</p></td>
	  <td>
	    <p>This is the filter mask for the root direct block, if filters
          are applied to heap objects.  This mask has the same format as
          that used for the filter mask in chunked raw data records in a
          <a href="#V1Btrees">v1 B-tree</a>.
          This field is only
          stored in the header if the <em>I/O Filters&rsquo; Encoded Length</em>
          is greater than 0.
	    </p>
	  </td>
	</tr>

    <tr>
      <td><p>I/O Filter Information</p></td>
	  <td>
	    <p>This is the I/O filter information encoding direct blocks and
          huge objects, if filters are applied to heap objects.  This
          field is encoded as a <a href="#FilterMessage">Filter Pipeline</a>
          message.
          The size of this field is determined by <em>I/O Filters&rsquo;
            Encoded Length</em>.
	    </p>
	  </td>
    </tr>

    <tr>
      <td><p>Checksum</p></td>
      <td>
        <p>This is the checksum for the header.</p>
      </td>
    </tr>

  </table>
</div>

<br />
<br />
<br />
<div align="center">
  <table class="format">
    <caption>
      Layout: Fractal Heap Direct Block
    </caption>

    <tr>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
    </tr>

    <tr>
      <td colspan="4">Signature</td>
    </tr>

    <tr>
      <td>Version</td>
      <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
    </tr>

    <tr>
      <td colspan="4"><br />Heap Header Address<sup>O</sup><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4">Block Offset <em>(variable size)</em></td>
    </tr>

    <tr>
      <td colspan="4">Checksum <em>(optional)</em></td>
    </tr>

    <tr>
      <td colspan="4"><br />Object Data <em>(variable size)</em><br /><br /></td>
    </tr>

  </table>

  <table class="note">
    <tr>
      <td width="60%">&nbsp;</td>
      <td width="40%">
        (Items marked with an &lsquo;O&rsquo; in the above table are
        of the size specified in the <a href="#SizeOfOffsetsV0">Size
          of Offsets</a> field in the superblock.)
    </td></tr>
  </table>

</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Fractal Heap Direct Block
    </caption>
	<tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
    </tr>

    <tr>
      <td><p>Signature</p></td>
      <td>
        <p>The ASCII character string &ldquo;<code>FHDB</code>&rdquo;
          is used to indicate the
          beginning of a fractal heap direct block.  This gives file consistency
          checking utilities a better chance of reconstructing a
          damaged file.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Version</p></td>
      <td>
        <p>This document describes version 0.</p>
      </td>
    </tr>

    <tr>
      <td><p>Heap Header Address</p></td>
      <td>
        <p>This is the address for the fractal heap header that this
          block belongs to.  This field is principally used for file
          integrity checking.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Block Offset</p></td>
      <td>
        <p>This is the offset of the block within the fractal heap&rsquo;s
          address space (in bytes).  The number of bytes used to encode
          this field is the <em>Maximum Heap Size</em> (in the heap&rsquo;s
          header) divided by 8 and rounded up to the next highest integer,
          for values that are not a multiple of 8.  This value is
          principally used for file integrity checking.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Checksum</p></td>
      <td>
        <p>This is the checksum for the direct block.</p>
	    <p>This field is only present if bit 1 of <em>Flags</em> in the
          heap&rsquo;s header is set.</p>
      </td>
    </tr>

    <tr>
      <td><p>Object Data</p></td>
      <td>
        <p>This section of the direct block stores the actual data for
          objects in the heap.  The size of this section is determined by
          the direct block&rsquo;s size minus the size of the other fields
          stored in the direct block (for example, the <em>Signature</em>,
          <em>Version</em>, and others including the <em>Checksum</em> if it is
          present).
        </p>
      </td>
    </tr>

  </table>
</div>

<br />
<br />
<br />
<div align="center">
  <table class="format">
    <caption>
      Layout: Fractal Heap Indirect Block
    </caption>

    <tr>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
    </tr>

    <tr>
      <td colspan="4">Signature</td>
    </tr>

    <tr>
      <td>Version</td>
      <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
    </tr>

    <tr>
      <td colspan="4"><br />Heap Header Address<sup>O</sup><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4">Block Offset <em>(variable size)</em></td>
    </tr>

    <tr>
      <td colspan="4"><br />Child Direct Block #0 Address<sup>O</sup><br /><br /></td>
	</tr>
	<tr>
	  <td colspan="4"><br />Size of Filtered Direct Block #0 <em>(optional)</em> <sup>L</sup><br /><br /></td>
	</tr>
	<tr>
	  <td colspan="4">Filter Mask for Direct Block #0 <em>(optional)</em></td>
	</tr>

    <tr>
      <td colspan="4"><br />Child Direct Block #1 Address<sup>O</sup><br /><br /></td>
	</tr>
	<tr>
	  <td colspan="4"><br />Size of Filtered Direct Block #1 <em>(optional)</em><sup>L</sup><br /><br /></td>
	</tr>
	<tr>
	  <td colspan="4">Filter Mask for Direct Block #1 <em>(optional)</em></td>
	</tr>

	<tr>
	  <td colspan="4">...</td>
	</tr>

    <tr>
      <td colspan="4"><br />Child Direct Block #K-1 Address<sup>O</sup><br /><br /></td>
	</tr>
	<tr>
	  <td colspan="4"><br />Size of Filtered Direct Block #K-1 <em>(optional)</em><sup>L</sup><br /><br /></td>
	</tr>
	<tr>
	  <td colspan="4">Filter Mask for Direct Block #K-1 <em>(optional)</em></td>
	</tr>

    <tr>
      <td colspan="4"><br />Child Indirect Block #0 Address<sup>O</sup><br /><br /></td>
	</tr>

    <tr>
      <td colspan="4"><br />Child Indirect Block #1 Address<sup>O</sup><br /><br /></td>
	</tr>

	<tr>
	  <td colspan="4">...</td>
	</tr>

    <tr>
      <td colspan="4"><br />Child Indirect Block #N-1 Address<sup>O</sup><br /><br /></td>
	</tr>

    <tr>
	  <td colspan="4">Checksum</td>
    </tr>
  </table>

  <table class="note">
    <tr>
      <td width="60%">&nbsp;</td>
      <td width="40%">
        (Items marked with an &lsquo;O&rsquo; in the above table are
        of the size specified in the <a href="#SizeOfOffsetsV0">Size
          of Offsets</a> field in the superblock.)
    </td></tr>
    <tr>
      <td>&nbsp;</td>
      <td>
        (Items marked with an &lsquo;L&rsquo; in the above table are
        of the size specified in the <a href="#SizeOfLengthsV0">Size
          of Lengths</a> field in the superblock.)
    </td></tr>
  </table>

</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Fractal Heap Indirect Block
    </caption>
	<tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
    </tr>

    <tr>
      <td><p>Signature</p></td>
      <td>
        <p>The ASCII character string &ldquo;<code>FHIB</code>&rdquo; is used to
          indicate the beginning of a fractal heap indirect block.  This
          gives file consistency checking utilities a better chance of
          reconstructing a damaged file.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Version</p></td>
      <td>
        <p>This document describes version 0.</p>
      </td>
    </tr>

    <tr>
      <td><p>Heap Header Address</p></td>
      <td>
        <p>This is the address for the fractal heap header that this
          block belongs to.  This field is principally used for file
          integrity checking.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Block Offset</p></td>
      <td>
        <p>This is the offset of the block within the fractal heap&rsquo;s
          address space (in bytes).  The number of bytes used to encode
          this field is the <em>Maximum Heap Size</em> (in the heap&rsquo;s
          header) divided by 8 and rounded up to the next highest integer,
          for values that are not a multiple of 8.  This value is
          principally used for file integrity checking.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Child Direct Block #K Address</p></td>
      <td>
	    <p>This field is the address of the child direct block.
          The size of the [uncompressed] direct block can be computed by
          its offset in the heap&rsquo;s linear address space.
        </p>
      </td>
    </tr>

	<tr>
	  <td><p>Size of Filtered Direct Block #K</p></td>
	  <td>
	    <p>This is the size of the child direct block after passing through
          the I/O filters defined for this heap (in bytes).  If no I/O
          filters are present for this heap, this field is not present.
        </p>
	  </td>
	</tr>
	<tr>
	  <td><p>Filter Mask for Direct Block #K</p></td>
	  <td>
        <p>This is the I/O filter mask for the filtered direct block.
          This mask has the same format as that used for the filter mask
          in chunked raw data records in a <a href="#V1Btrees">v1 B-tree</a>.
          If no I/O filters are present for this heap, this field is not
          present.
        </p>
	  </td>
    </tr>

    <tr>
      <td><p>Child Indirect Block #N Address</p></td>
      <td>
	    <p>This field is the address of the child indirect block.
          The size of the indirect block can be computed by
          its offset in the heap&rsquo;s linear address space.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Checksum</p></td>
      <td>
        <p>This is the checksum for the indirect block.</p>
      </td>
    </tr>

  </table>

</div>

<br />
<p>An object in the fractal heap is identified by means of a fractal heap ID,
  which encodes information to locate the object in the heap.
  Currently, the fractal heap stores an object in one of three ways,
  depending on the object&rsquo;s size:</p>

<div align="center">
  <table class="list80">
    <tr>
      <th width="20%">Type</th>
      <th width="80%" align="left">Description</th>
    </tr>

    <tr>
      <td align="center">Tiny</td>
      <td>
        <p>When an object is small enough to be encoded in the
          heap ID, the object&rsquo;s data is embedded in the fractal
          heap ID itself.  There are two sub-types for this type of
          object: normal and extended. The sub-type for tiny heap
          IDs depends on whether the heap ID is large enough to
          store objects greater than 16 bytes or not. If the
          heap ID length is 18 bytes or smaller, the
          &lsquo;normal&rsquo; tiny heap ID form is used. If the
          heap ID length is greater than 18 bytes in length, the
          &ldquo;extended&rdquo; form is used. See the format
          description below for both sub-types.
        </p>
      </td>
    </tr>

    <tr>
      <td align="center">Huge</td>
      <td>
        <p>When the size of an object is larger than <em>Maximum Size of
            Managed Objects</em> in the <em>Fractal Heap Header</em>, the
          object&rsquo;s data is stored on its own in the file and the object
          is tracked/indexed via a version 2 B-tree.  All huge objects
          for a particular fractal heap use the same v2 B-tree.  All huge
          objects for a particular fractal heap use the same format for
          their huge object IDs.
        </p>

        <p>Depending on whether the IDs for a heap are large enough to hold
          the object&rsquo;s retrieval information and whether I/O pipeline filters
          are applied to the heap&rsquo;s objects, 4 sub-types are derived for
          huge object IDs for this heap:</p>

        <div align="center">
          <table class="list">
            <tr>
              <th align="left" width="35%">Sub-type</th>
              <th align="left">Description</th>
            </tr>

            <tr>
              <td align="left">Directly accessed, non-filtered</td>
              <td>
                <p>The object&rsquo;s address and length are embedded in the
                  fractal heap ID itself and the object is directly accessed
                  from them.  This allows the object to be accessed without
                  resorting to the B-tree.
                </p>
              </td>
            </tr>

            <tr>
              <td align="left">Directly accessed, filtered</td>
              <td>
                <p>The filtered object&rsquo;s address, length, filter mask and
                  de-filtered size are embedded in the fractal heap ID itself
                  and the object is accessed directly with them.  This allows
                  the object to be accessed without resorting to the B-tree.
                </p>
              </td>
            </tr>

            <tr>
              <td align="left">Indirectly accessed, non-filtered</td>
              <td>
                <p>The object is located by using a B-tree key embedded in
                  the fractal heap ID to retrieve the address and length from
                  the version 2 B-tree for huge objects.  Then, the address
                  and length are used to access the object.
                </p>
              </td>
            </tr>

            <tr>
              <td align="left">Indirectly accessed, filtered</td>
              <td>
                <p>The object is located by using a B-tree key embedded in
                  the fractal heap ID to retrieve the filtered object&rsquo;s
                  address, length, filter mask and de-filtered size from the
                  version 2 B-tree for huge objects.  Then, this information
                  is used to access the object.
                </p>
              </td>
            </tr>
          </table>
        </div>

      </td>
    </tr>

    <tr>
      <td align="center">Managed</td>
      <td>
        <p>When the size of an object does not meet the above two
          conditions, the object is stored and managed via the direct and
          indirect blocks based on the doubling table.
        </p>
      </td>
    </tr>
  </table>
</div>


<br />
<p>The specific format for each type of heap ID is described below:
</p>

<div align="center">
  <table class="format">
    <caption>
      Layout: Fractal Heap ID for Tiny Objects (Sub-type 1 -
      &lsquo;Normal&rsquo;)
    </caption>

    <tr>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
	</tr>

    <tr>
      <td>Version, Type, and Length</td>
      <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
    </tr>

    <tr>
      <td colspan="4"><br />Data <em>(variable size)</em></td>
    </tr>

  </table>
</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Fractal Heap ID for Tiny Objects (Sub-type 1 -
      &lsquo;Normal&rsquo;)
    </caption>
	<tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
    </tr>

    <tr>
      <td><p>Version, Type, and Length</p></td>
      <td>
        <p>This is a bit field with the following definition:
          <table class="list">
            <tr>
              <th width="20%" align="center">Bit</th>
              <th width="80%" align="left">Description</th>
            </tr>

            <tr>
              <td align="center"><code>6-7</code></td>
              <td>The current version of ID format.  This document
                describes version 0.
              </td>
            </tr>
            <tr>
              <td align="center"><code>4-5</code></td>
              <td>The ID type.  Tiny objects have a value of <code>2</code>.
              </td>
            </tr>
            <tr>
              <td align="center"><code>0-3</code></td>
              <td>The length of the tiny object. The value stored
                is one less than the actual length (since zero-length
                objects are not allowed to be stored in the heap).
                For example, an object of actual length 1 has an
                encoded length of 0, an object of actual length 2
                has an encoded length of 1, and so on.
              </td>
            </tr>
	    </table></p>

      </td>
    </tr>

    <tr>
      <td><p>Data</p></td>
      <td>
        <p>This is the data for the object.
        </p>
      </td>
    </tr>

  </table>
</div>

<br />
<br />
<br />
<div align="center">
  <table class="format">
    <caption>
      Layout: Fractal Heap ID for Tiny Objects (Sub-type 2 -
      &lsquo;Extended&rsquo;)
    </caption>

    <tr>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
	</tr>

    <tr>
      <td>Version, Type, and Length</td>
      <td>Extended Length</td>
      <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
    </tr>

    <tr>
      <td colspan="4">Data <em>(variable size)</em></td>
    </tr>

  </table>
</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Fractal Heap ID for Tiny Objects (Sub-type 2 -
      &lsquo;Extended&rsquo;)
    </caption>
	<tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
    </tr>

    <tr>
      <td><p>Version, Type, and Length</p></td>
      <td>
        <p>This is a bit field with the following definition:
          <table class="list">
            <tr>
              <th width="20%" align="center">Bit</th>
              <th width="80%" align="left">Description</th>
            </tr>

            <tr>
              <td align="center"><code>6-7</code></td>
              <td>The current version of ID format.  This document
                describes version 0.
              </td>
            </tr>
            <tr>
              <td align="center"><code>4-5</code></td>
              <td>The ID type.  Tiny objects have a value of <code>2</code>.
              </td>
            </tr>
            <tr>
              <td align="center"><code>0-3</code></td>
              <td>These 4 bits, together with the next byte, form an
                unsigned 12-bit integer for holding the length of the
                object.  These 4-bits are bits 8-11 of the 12-bit integer.
                See description for the <em>Extended Length</em> field below.
              </td>
            </tr>
	    </table></p>

      </td>
    </tr>

    <tr>
      <td><p>Extended Length</p></td>
      <td>
        <p>This byte, together with the 4 bits in the previous byte,
          forms an unsigned 12-bit integer for holding the length of
          the tiny object.  These 8 bits are bits 0-7 of the 12-bit
          integer formed. The value stored is one less than the actual
          length (since zero-length objects are not allowed to be
          stored in the heap). For example, an object of actual length
          1 has an encoded length of 0, an object of actual length
          2 has an encoded length of 1, and so on.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Data</p></td>
      <td>
        <p>This is the data for the object.
        </p>
      </td>
    </tr>

  </table>
</div>


<br />
<br />
<br />
<div align="center">
  <table class="format">
    <caption>
      Layout: Fractal Heap ID for Huge Objects (Sub-types 1 and 2):
      Indirectly Accessed, Non-filtered/Filtered
    </caption>

    <tr>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
    </tr>

    <tr>
      <td>Version and Type</td>
      <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
          only to align table nicely</em></td>
    </tr>

    <tr>
      <td colspan="4"><br />v2 B-tree Key<sup>L</sup><em> (variable size)</em><br /><br /></td>
    </tr>

  </table>

  <table class="note">
    <tr>
      <td width="60%">&nbsp;</td>
      <td width="40%">
        (Items marked with an &lsquo;L&rsquo; in the above table are
        of the size specified in the <a href="#SizeOfLengthsV0">Size
          of Lengths</a> field in the superblock.)
    </td></tr>
  </table>
</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Fractal Heap ID for Huge Objects (Sub-types 1 and 2):
      Indirectly Accessed, Non-filtered/Filtered
    </caption>
    <tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
    </tr>

    <tr>
      <td><p>Version and Type</p></td>
      <td>
        <p>This is a bit field with the following definition:
          <table class="list">
            <tr>
              <th width="20%" align="center">Bit</th>
              <th width="80%" align="left">Description</th>
            </tr>

            <tr>
              <td align="center"><code>6-7</code></td>
              <td>The current version of ID format.  This document
                describes version 0.
              </td>
            </tr>
            <tr>
              <td align="center"><code>4-5</code></td>
              <td>The ID type.  Huge objects have a value of <code>1</code>.
              </td>
            </tr>
            <tr>
              <td align="center"><code>0-3</code></td>
              <td>Reserved.
              </td>
            </tr>
        </table></p>

      </td>
    </tr>

    <tr>
      <td><p>v2 B-tree Key</p></td>
      <td><p>This field is the B-tree key for retrieving the information
          from the version 2 B-tree for huge objects needed to access the
          object.  See the description of <a href="#V2Btrees">v2 B-tree</a>
          records sub-types 1 and 2 for a description of the fields.  New key
          values are derived from <em>Next Huge Object ID</em> in the
          <em>Fractal Heap Header</em>.</p>
      </td>
    </tr>

  </table>
</div>

<br />
<br />
<br />
<div align="center">
  <table class="format">
    <caption>
      Layout: Fractal Heap ID for Huge Objects (Sub-type 3):
      Directly Accessed, Non-filtered
    </caption>

    <tr>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
    </tr>

    <tr>
      <td>Version and Type</td>
      <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
    </tr>

    <tr>
      <td colspan="4"><br />Address <sup>O</sup><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4"><br />Length <sup>L</sup><br /><br /></td>
    </tr>

  </table>

  <table class="note">
    <tr>
      <td width="60%">&nbsp;</td>
      <td width="40%">
        (Items marked with an &lsquo;O&rsquo; in the above table are
        of the size specified in the <a href="#SizeOfOffsetsV0">Size
          of Offsets</a> field in the superblock.)
    </td></tr>
    <tr>
      <td>&nbsp;</td>
      <td>
        (Items marked with an &lsquo;L&rsquo; in the above table are
        of the size specified in the <a href="#SizeOfLengthsV0">Size
          of Lengths</a> field in the superblock.)
    </td></tr>
  </table>

</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Fractal Heap ID for Huge Objects (Sub-type 3):
      Directly Accessed, Non-filtered
    </caption>
    <tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
    </tr>

    <tr>
      <td><p>Version and Type</p></td>
      <td>
        <p>This is a bit field with the following definition:
          <table class="list">
            <tr>
              <th width="20%" align="center">Bit</th>
              <th width="80%" align="left">Description</th>
            </tr>

            <tr>
              <td align="center"><code>6-7</code></td>
              <td>The current version of ID format.  This document
                describes version 0.
              </td>
            </tr>
            <tr>
              <td align="center"><code>4-5</code></td>
              <td>The ID type.  Huge objects have a value of <code>1</code>.
              </td>
            </tr>
            <tr>
              <td align="center"><code>0-3</code></td>
              <td>Reserved.
              </td>
            </tr>
        </table></p>

      </td>
    </tr>

    <tr>
      <td><p>Address</p></td>
      <td><p>This field is the address of the object in the file.</p>
      </td>
    </tr>

    <tr>
      <td><p>Length</p></td>
      <td><p>This field is the length of the object in the file.</p>
      </td>
    </tr>
  </table>
</div>

<br />
<br />
<br />
<div align="center">
  <table class="format">
    <caption>
      Layout: Fractal Heap ID for Huge Objects (Sub-type 4):
      Directly Accessed, Filtered
    </caption>

    <tr>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
    </tr>

    <tr>
      <td>Version and Type</td>
      <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
    </tr>

    <tr>
      <td colspan="4"><br />Address <sup>O</sup><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4"><br />Length <sup>L</sup><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4">Filter Mask</td>
    </tr>

    <tr>
      <td colspan="4"><br />De-filtered Size <sup>L</sup><br /><br /></td>
    </tr>

  </table>

  <table class="note">
    <tr>
      <td width="60%">&nbsp;</td>
      <td width="40%">
        (Items marked with an &lsquo;O&rsquo; in the above table are
        of the size specified in the <a href="#SizeOfOffsetsV0">Size
          of Offsets</a> field in the superblock.)
    </td></tr>
    <tr>
      <td>&nbsp;</td>
      <td>
        (Items marked with an &lsquo;L&rsquo; in the above table are
        of the size specified in the <a href="#SizeOfLengthsV0">Size
          of Lengths</a> field in the superblock.)
    </td></tr>
  </table>

</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Fractal Heap ID for Huge Objects (Sub-type 4):
      Directly Accessed, Filtered
    </caption>
    <tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
    </tr>

    <tr>
      <td><p>Version and Type</p></td>
      <td>
        <p>This is a bit field with the following definition:
          <table class="list">
            <tr>
              <th width="20%" align="center">Bit</th>
              <th width="80%" align="left">Description</th>
            </tr>

            <tr>
              <td align="center"><code>6-7</code></td>
              <td>The current version of ID format.  This document
                describes version 0.
              </td>
            </tr>
            <tr>
              <td align="center"><code>4-5</code></td>
              <td>The ID type.  Huge objects have a value of <code>1</code>.
              </td>
            </tr>
            <tr>
              <td align="center"><code>0-3</code></td>
              <td>Reserved.
              </td>
            </tr>
        </table></p>

      </td>
    </tr>

    <tr>
      <td><p>Address</p></td>
      <td><p>This field is the address of the filtered object in the file.</p>
      </td>
	</tr>

	<tr>
	  <td><p>Length</p></td>
	  <td><p>This field is the length of the filtered object in the file.</p>
	  </td>
	</tr>

	<tr>
	  <td><p>Filter Mask</p></td>
	  <td><p>This field is the I/O pipeline filter mask for the
		  filtered object in the file.</p>
	  </td>
	</tr>

	<tr>
	  <td><p>Filtered Size</p></td>
	  <td><p>This field is the size of the de-filtered object in the file.</p>
	  </td>
	</tr>

  </table>
</div>

<br />
<br />
<br />
<div align="center">
  <table class="format">
    <caption>
      Layout: Fractal Heap ID for Managed Objects
    </caption>

    <tr>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
	</tr>

    <tr>
      <td>Version and Type</td>
      <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
    </tr>
    <tr>
      <td colspan="4">Offset <em>(variable size)</em></td>
    </tr>

    <tr>
      <td colspan="4">Length <em>(variable size)</em></td>
    </tr>
  </table>
</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Fractal Heap ID for Managed Objects
    </caption>
	<tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
    </tr>

    <tr>
      <td><p>Version and Type</p></td>
      <td><p>This is a bit field with the following definition:
          <table class="list">
            <tr>
              <th width="20%" align="center">Bit</th>
              <th width="80%" align="left">Description</th>
            </tr>

            <tr>
              <td align="center"><code>6-7</code></td>
              <td>The current version of ID format.  This document
                describes version 0.
              </td>
            </tr>
            <tr>
              <td align="center"><code>4-5</code></td>
              <td>The ID type.  Managed objects have a value of <code>0</code>.
              </td>
            </tr>
            <tr>
              <td align="center"><code>0-3</code></td>
              <td>Reserved.
              </td>
            </tr>
        </table></p>
      </td>
    </tr>

    <tr>
      <td><p>Offset</p></td>
      <td><p>This field is the offset of the object in the heap.
          This field&rsquo;s size is the minimum number of bytes
          necessary to encode the <em>Maximum Heap Size</em> value
          (from the <em>Fractal Heap Header</em>). For example, if the
          value of the <em>Maximum Heap Size</em> is less than 256 bytes,
          this field is 1 byte in length, a <em>Maximum Heap Size</em>
          of 256-65535 bytes uses a 2 byte length, and so on.</p></td>
    </tr>

    <tr>
      <td><p>Length</p></td>
      <td><p>This field is the length of the object in the heap. It
          is determined by taking the minimum value of <em>Maximum
            Direct Block Size</em> and <em>Maximum Size of Managed
            Objects</em> in the <em>Fractal Heap Header</em>. Again,
          the minimum number of bytes needed to encode that value is
          used for the size of this field.</p></td>
    </tr>
  </table>
</div>

<h3><a name="FreeSpaceManager">
    III.H. Disk Format: Level 1H - Free-space Manager</a></h3>

<p>
  Free-space managers are used to describe space within a heap or
  the entire HDF5 file that is not currently used for that heap or
  file.
</p>

<p>
  The <em>free-space manager header</em> contains metadata information
  about the space being tracked, along with the address of the list
  of <em>free space sections</em> which actually describes the free
  space. The header records information about free-space sections being
  tracked, creation parameters for handling free-space sections of a
  client, and section information used to locate the collection of
  free-space sections.
</p>

<p>
  The <em>free-space section list</em> stores a collection of
  free-space sections that is specific to each <em>client</em> of the
  free-space manager.

  For example, the fractal heap is a client of the free space manager
  and uses it to track unused space within the heap.  There are 4
  types of section records for the fractal heap, each of which has
  its own format, listed below.
</p>

<div align="center">
  <table class="format">
    <caption>
      Layout: Free-space Manager Header
    </caption>

    <tr>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
    </tr>

    <tr>
      <td colspan="4">Signature</td>
    </tr>

    <tr>
      <td>Version</td>
      <td>Client ID</td>
      <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
    </tr>

    <tr>
      <td colspan="4"><br />Total Space Tracked<sup>L</sup><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4"><br />Total Number of Sections<sup>L</sup><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4"><br />Number of Serialized Sections<sup>L</sup><br /><br /></td>
	</tr>

	<tr>
	  <td colspan="4"><br />Number of Un-Serialized Sections<sup>L</sup><br /><br /></td>
	</tr>

	<tr>
	  <td colspan="2">Number of Section Classes</td>
      <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
	</tr>

    <tr>
      <td colspan="2">Shrink Percent</td>
      <td colspan="2">Expand Percent</td>
    </tr>

    <tr>
      <td colspan="2">Size of Address Space</td>
      <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
	</tr>

    <tr>
      <td colspan="4"><br />Maximum Section Size <sup>L</sup><br /><br /></td>
	</tr>

    <tr>
      <td colspan="4"><br />Address of Serialized Section List<sup>O</sup><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4"><br />Size of Serialized Section List Used<sup>L</sup><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4"><br />Allocated Size of Serialized Section List<sup>L</sup><br /><br /></td>
	</tr>

	<tr>
	  <td colspan="4">Checksum</td>
	</tr>
  </table>

  <table class="note">
    <tr>
      <td width="60%">&nbsp;</td>
      <td width="40%">
        (Items marked with an &lsquo;L&rsquo; in the above table are
        of the size specified in the <a href="#SizeOfLengthsV0">Size
          of Lengths</a> field in the superblock.)
    </td></tr>
    <tr>
      <td>&nbsp;</td>
      <td>
        (Items marked with an &lsquo;O&rsquo; in the above table are
        of the size specified in the <a href="#SizeOfOffsetsV0">Size
          of Offsets</a> field in the superblock.)
    </td></tr>
  </table>

</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Free-space Manager Header
    </caption>
	<tr>
      <th width="35%">Field Name</th>
      <th>Description</th>
    </tr>

    <tr>
      <td><p>Signature</p></td>
      <td>
        <p>The ASCII character string &ldquo;<code>FSHD</code>&rdquo;
          is used to indicate the beginning of the Free-space Manager
          Header. This gives file consistency checking utilities a
          better chance of reconstructing a damaged file.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Version</p></td>
      <td>
        <p>This is the version number for the Free-space Manager Header
		  and this document describes version 0.</p>
      </td>
    </tr>

    <tr>
      <td><p>Client ID</p></td>
      <td>
        <p>This is the client ID for identifying the user of this
          free-space manager:

          <table class="list">
            <tr>
              <th width="20%" align="center">ID</th>
              <th width="80%" align="left">Description</th>
            </tr>

            <tr>
              <td align="center"><code>0</code></td>
              <td>Fractal heap
              </td>
            </tr>
            <tr>
              <td align="center"><code>1</code></td>
              <td>File
              </td>
            </tr>
            <tr>
              <td align="center"><code>2+</code></td>
              <td>Reserved.
              </td>
            </tr>
        </table></p>

      </td>
    </tr>

	<tr>
      <td><p>Total Space Tracked</p></td>
	  <td>
        <p>This is the total amount of free space being tracked, in bytes.
        </p>
      </td>
	</tr>

    <tr>
      <td><p>Total Number of Sections</p></td>
      <td>
	    <p>This is the total number of free-space sections being tracked.
        </p>
      </td>
    </tr>

	<tr>
	  <td><p>Number of Serialized Sections</p></td>
	  <td>
	    <p>This is the number of serialized free-space sections being
          tracked.
        </p>
	  </td>
	</tr>
	<tr>
	  <td><p>Number of Un-Serialized Sections</p></td>
	  <td>
        <p>This is the number of un-serialized free-space sections being
          managed.  Un-serialized sections are created by the free-space
          client when the list of sections is read in.
        </p>
	  </td>
    </tr>

    <tr>
      <td><p>Number of Section Classes</p></td>
      <td>
	    <p>This is the number of section classes handled by this free space
          manager for the free-space client.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Shrink Percent</p></td>
      <td>
	    <p>This is the percent of current size to shrink the allocated
          serialized free-space section list.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Expand Percent</p></td>
      <td>
	    <p>This is the percent of current size to expand the allocated
          serialized free-space section list.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Size of Address Space</p></td>
      <td>
        <p>This is the size of the address space that free-space sections
          are within.  This is stored as the log<sub>2</sub> of the
          actual value (in other words, the number of bits required
          to store values within that address space).
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Maximum Section Size</p></td>
      <td>
        <p>This is the maximum size of a section to be tracked.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Address of Serialized Section List</p></td>
      <td>
        <p>This is the address where the serialized free-space section
          list is stored.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Size of Serialized Section List Used</p></td>
      <td>
        <p>This is the size of the serialized free-space section
          list used (in bytes).  This value must be less than
          or equal to the <em>allocated size of serialized section
            list</em>, below.
	    </p>
      </td>
    </tr>

    <tr>
      <td><p>Allocated Size of Serialized Section List</p></td>
      <td>
        <p>This is the size of serialized free-space section list
          actually allocated (in bytes).
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Checksum</p></td>
      <td>
        <p>This is the checksum for the free-space manager header.</p>
      </td>
    </tr>

  </table>
</div>

<br />
<p>The free-space sections being managed are stored in a
  <em>free-space section list</em>, described below. The sections
  in the free-space section list are stored in the following way:
  a count of the number of sections describing a particular size of
  free space and the size of the free-space described (in bytes),
  followed by a list of section description records; then another
  section count and size, followed by the list of section
  descriptions for that size; and so on.</p>


<div align="center">
  <table class="format">
    <caption>
      Layout: Free-space Section List
    </caption>

    <tr>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
    </tr>

    <tr>
      <td colspan="4">Signature</td>
    </tr>

    <tr>
      <td>Version</td>
      <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
    </tr>

    <tr>
      <td colspan="4"><br />Free-space Manager Header Address<sup>O</sup><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4">Number of Section Records in Set #0 <em>(variable size)</em></td>
    </tr>

    <tr>
      <td colspan="4">Size of Free-space Section Described in Record Set #0 <em>(variable size)</em></td>
	</tr>

	<tr>
	  <td colspan="4">Record Set #0 Section Record #0 Offset<em>(variable size)</em></td>
	</tr>

	<tr>
	  <td colspan="1">Record Set #0 Section Record #0 Type</td>
      <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
	</tr>

	<tr>
	  <td colspan="4">Record Set #0 Section Record #0 Data <em>(variable size)</em></td>
	</tr>

	<tr>
	  <td colspan="4">...</td>
	</tr>

	<tr>
	  <td colspan="4">Record Set #0 Section Record #K-1 Offset<em>(variable size)</em></td>
	</tr>

	<tr>
	  <td colspan="1">Record Set #0 Section Record #K-1 Type</td>
      <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
	</tr>

	<tr>
	  <td colspan="4">Record Set #0 Section Record #K-1 Data <em>(variable size)</em></td>
	</tr>

    <tr>
      <td colspan="4">Number of Section Records in Set #1 <em>(variable size)</em></td>
    </tr>

    <tr>
      <td colspan="4">Size of Free-space Section Described in Record Set #1 <em>(variable size)</em></td>
	</tr>

	<tr>
	  <td colspan="4">Record Set #1 Section Record #0 Offset<em>(variable size)</em></td>
	</tr>

	<tr>
	  <td colspan="1">Record Set #1 Section Record #0 Type</td>
      <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
	</tr>

	<tr>
	  <td colspan="4">Record Set #1 Section Record #0 Data <em>(variable size)</em></td>
	</tr>

	<tr>
	  <td colspan="4">...</td>
	</tr>

	<tr>
	  <td colspan="4">Record Set #1 Section Record #K-1 Offset<em>(variable size)</em></td>
	</tr>

	<tr>
	  <td colspan="1">Record Set #1 Section Record #K-1 Type</td>
      <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
	</tr>

	<tr>
	  <td colspan="4">Record Set #1 Section Record #K-1 Data <em>(variable size)</em></td>
	</tr>

	<tr>
	  <td colspan="4"><strong>...</strong></td>
	</tr>

	<tr>
	  <td colspan="4"><strong>...</strong></td>
	</tr>

    <tr>
      <td colspan="4">Number of Section Records in Set #N-1 <em>(variable size)</em></td>
    </tr>

    <tr>
      <td colspan="4">Size of Free-space Section Described in Record Set #N-1 <em>(variable size)</em></td>
	</tr>

	<tr>
	  <td colspan="4">Record Set #N-1 Section Record #0 Offset<em>(variable size)</em></td>
	</tr>

	<tr>
	  <td colspan="1">Record Set #N-1 Section Record #0 Type</td>
      <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
	</tr>

	<tr>
	  <td colspan="4">Record Set #N-1 Section Record #0 Data <em>(variable size)</em></td>
	</tr>

	<tr>
	  <td colspan="4">...</td>
	</tr>

	<tr>
	  <td colspan="4">Record Set #N-1 Section Record #K-1 Offset<em>(variable size)</em></td>
	</tr>

	<tr>
	  <td colspan="1">Record Set #N-1 Section Record #K-1 Type</td>
      <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
	</tr>

	<tr>
	  <td colspan="4">Record Set #N-1 Section Record #K-1 Data <em>(variable size)</td>
	</tr>

	<tr>
	  <td colspan="4">Checksum</td>
	</tr>
  </table>

  <table class="note">
    <tr>
      <td width="60%">&nbsp;</td>
      <td width="40%">
        (Items marked with an &lsquo;O&rsquo; in the above table are
        of the size specified in the <a href="#SizeOfOffsetsV0">Size
          of Offsets</a> field in the superblock.)
    </td></tr>
  </table>
</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Free-space Section List
    </caption>
	<tr>
      <th width="35%">Field Name</th>
      <th>Description</th>
    </tr>

    <tr>
      <td><p>Signature</p></td>
      <td>
        <p>The ASCII character string &ldquo;<code>FSSE</code>&rdquo;
          is used to indicate the beginning of the Free-space Section
          Information. This gives file consistency checking utilities
          a better chance of reconstructing a damaged file.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Version</p></td>
      <td>
        <p>This is the version number for the Free-space Section List
		  and this document describes version 0.</p>
      </td>
    </tr>

    <tr>
      <td><p>Free-space Manager Header Address</p></td>
      <td>
        <p>This is the address of the <em>Free-space Manager Header</em>.
          This field is principally used for file
          integrity checking.
        </p>
      </td>
    </tr>

	<tr>
      <td><p>Number of Section Records for Set #N</p></td>
	  <td>
        <p>This is the number of free-space section records for set #N.
		  The length of this field is the minimum number of bytes needed
          to store the <em>number of serialized sections</em> (from the
          <em>free-space manager header</em>).
        </p>

        <p>
          The number of sets of free-space section records is
          determined by the <em>size of serialized section list</em> in
          the <em>free-space manager header</em>.
        </p>
      </td>
	</tr>

    <tr>
      <td><p>Section Size for Record Set #N</p></td>
      <td>
	    <p>This is the size (in bytes) of the free-space section described
          for <em>all</em> the section records in set #N.
        </p>

        <p>
		  The length of this field is the minimum number of bytes needed
          to store the <em>maximum section size</em> (from the
          <em>free-space manager header</em>).
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Record Set #N Section #K Offset</p></td>
      <td>
	    <p>This is the offset (in bytes) of the free-space section within
          the client for the free-space manager.
        </p>

        <p>
		  The length of this field is the minimum number of bytes needed
          to store the <em>size of address space</em> (from the
          <em>free-space manager header</em>).
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Record Set #N Section #K Type</p></td>
      <td>
	    <p>This is the type of the section record, used to decode the
          <em>record set #N section #K data</em> information. The defined
          record type for <em>file</em> client is:

          <table class="list">
            <tr>
              <th width="20%" align="center">Type</th>
              <th width="80%" align="left">Description</th>
            </tr>

            <tr>
              <td align="center"><code>0</code></td>
              <td>File&rsquo;s section (a range of actual bytes in file)
              </td>
            </tr>
            <tr>
              <td align="center"><code>1+</code></td>
              <td>Reserved.
              </td>
            </tr>
        </table></p>

	    <p>The defined record types for a <em>fractal heap</em> client are:

          <table class="list">
            <tr>
              <th width="20%" align="center">Type</th>
              <th width="80%" align="left">Description</th>
            </tr>

            <tr>
              <td align="center"><code>0</code></td>
              <td>Fractal heap &ldquo;single&rdquo; section
              </td>
            </tr>

            <tr>
              <td align="center"><code>1</code></td>
              <td>Fractal heap &ldquo;first row&rdquo; section
              </td>
            </tr>

            <tr>
              <td align="center"><code>2</code></td>
              <td>Fractal heap &ldquo;normal row&rdquo; section
              </td>
            </tr>

            <tr>
              <td align="center"><code>3</code></td>
              <td>Fractal heap &ldquo;indirect&rdquo; section
              </td>
            </tr>

            <tr>
              <td align="center"><code>4+</code></td>
              <td>Reserved.
              </td>
            </tr>
        </table></p>

      </td>
    </tr>

    <tr>
      <td><p>Record Set #N Section #K Data</p></td>
      <td>
	    <p>This is the section-type specific information for each record
          in the record set, described below.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Checksum</p></td>
      <td>
	    <p>This is the checksum for the <em>Free-space Section List</em>.
        </p>
      </td>
    </tr>

  </table>
</div>

<br />
<p>
  The section-type specific data for each free-space section record is
  described below:
</p>

<div align="center">
  <table class="format">
    <caption>
      Layout: File&rsquo;s Section Data Record
    </caption>

    <tr>
      <td colspan="4"><em>No additional record data stored</em></td>
    </tr>
  </table>
</div>

<br />
<br />
<br />
<div align="center">
  <table class="format">
    <caption>
      Layout: Fractal Heap &ldquo;Single&rdquo; Section Data Record
    </caption>

    <tr>
      <td colspan="4"><em>No additional record data stored</em></td>
    </tr>
  </table>
</div>

<br />
<br />
<br />
<div align="center">
  <table class="format">
    <caption>
      Layout: Fractal Heap &ldquo;First Row&rdquo; Section Data
      Record
    </caption>

    <tr>
      <td colspan="4"><em>Same format as &ldquo;indirect&rdquo;
          section data</em></td>
    </tr>
  </table>
</div>

<br />
<br />
<br />
<div align="center">
  <table class="format">
    <caption>
      Layout: Fractal Heap &ldquo;Normal Row&rdquo; Section Data
      Record
    </caption>

    <tr>
      <td colspan="4"><em>No additional record data stored</em></td>
    </tr>
  </table>
</div>

<br />
<br />
<br />
<div align="center">
  <table class="format">
    <caption>
      Layout: Fractal Heap &ldquo;Indirect&rdquo; Section
      Data Record
    </caption>

    <tr>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
    </tr>

    <tr>
      <td colspan="4">Fractal Heap Indirect Block Offset <em>(variable size)</em></td>
    </tr>

    <tr>
      <td colspan="2">Block Start Row</td>
      <td colspan="2">Block Start Column</td>
    </tr>

    <tr>
      <td colspan="2">Number of Blocks</td>
      <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
    </tr>
  </table>
</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Fractal Heap &ldquo;Indirect&rdquo; Section
      Data Record
    </caption>
	<tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
    </tr>

    <tr>
      <td><p>Fractal Heap Block Offset</p></td>
      <td>
        <p>The offset of the indirect block in the fractal heap&rsquo;s address
          space containing the empty blocks.
        </p>
        <p>
          The number of bytes used to encode this field is the minimum
          number of bytes needed to encode values for the <em>Maximum
            Heap Size</em> (in the fractal heap&rsquo;s header).
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Block Start Row</p></td>
      <td>
        <p>This is the row that the empty blocks start in.
	    </p>
      </td>
    </tr>

    <tr>
      <td><p>Block Start Column</p></td>
      <td>
        <p>This is the column that the empty blocks start in.
	    </p>
      </td>
    </tr>

    <tr>
      <td><p>Number of Blocks</p></td>
      <td>
        <p>This is the number of empty blocks covered by the section.
	    </p>
      </td>
    </tr>
  </table>
</div>

<h3><a name="SOHMTable">
    III.I. Disk Format: Level 1I - Shared Object Header Message Table</a></h3>

<p>
  The <em>shared object header message table</em> is used to locate
  object
  header messages that are shared between two or more object headers
  in the file.  Shared object header messages are stored and indexed
  in the file in one of two ways: indexed sequentially in a
  <em>shared header message list</em> or indexed with a v2 B-tree.
  The shared messages themselves are either stored in a fractal
  heap (when two or more objects share the message), or remain in an
  object&rsquo;s header (when only one object uses the message currently,
  but the message can be shared in the future).
</p>

<p>
  The <em>shared object header message table</em>
  contains a list of shared message index headers.  Each index header
  records information about the version of the index format, the index
  storage type, flags for the message types indexed, the number of
  messages in the index, the address where the index resides,
  and the fractal heap address if shared messages are stored there.
</p>

<p>
  Each index can be either a list or a v2 B-tree and may transition
  between those two forms as the number of messages in the index
  varies.  Each shared message record contains information used to
  locate the shared message from either a fractal heap or an object
  header.  The types of messages that can be shared are: <em>Dataspace,
    Datatype, Fill Value, Filter Pipeline and Attribute</em>.
</p>

<p>
  The <em>shared object header message table</em> is pointed to
  from a <a href="#SOHMTableMessage">shared message table</a> message
  in the superblock extension for a file.  This message stores the
  version of the table format, along with the number of index headers
  in the table.
</p>

<div align="center">
  <table class="format">
    <caption>
      Layout: Shared Object Header Message Table
    </caption>

    <tr>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
    </tr>

    <tr>
      <td colspan="4">Signature</td>
    </tr>

    <tr>
      <td>Version for index #0</td>
      <td>Index Type for index #0</td>
      <td colspan="2">Message Type Flags for index #0</td>
    </tr>

    <tr>
      <td colspan="4">Minimum Message Size for index #0</td>
    </tr>

    <tr>
      <td colspan="2">List Cutoff for index #0</td>
      <td colspan="2">v2 B-tree Cutoff for index #0</td>
    </tr>

    <tr>
      <td colspan="2">Number of Messages for index #0</td>
      <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
	</tr>

	<tr>
	  <td colspan="4"><br />Index Address<sup>O</sup> for index #0<br /><br /></td>
	</tr>

	<tr>
	  <td colspan="4"><br />Fractal Heap Address<sup>O</sup> for index #0<br /><br /></td>
	</tr>

    <tr>
      <td colspan="4">...</td>
	</tr>

    <tr>
      <td colspan="4">...</td>
	</tr>

    <tr>
      <td>Version for index #N-1</td>
      <td>Index Type for index #N-1</td>
      <td colspan="2">Message Type Flags for index #N-1</td>
    </tr>

    <tr>
      <td colspan="4">Minimum Message Size for index #N-1</td>
    </tr>

    <tr>
      <td colspan="2">List Cutoff for index #N-1</td>
      <td colspan="2">v2 B-tree Cutoff for index #N-1</td>
    </tr>

    <tr>
      <td colspan="2">Number of Messages for index #N-1</td>
      <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
	</tr>

	<tr>
	  <td colspan="4"><br />Index Address<sup>O</sup> for index #N-1<br /><br /></td>
	</tr>

	<tr>
	  <td colspan="4"><br />Fractal Heap Address<sup>O</sup> for index #N-1<br /><br /></td>
	</tr>

	<tr>
	  <td colspan="4">Checksum</td>
	</tr>
  </table>

  <table class="note">
    <tr>
      <td width="60%">&nbsp;</td>
      <td width="40%">
        (Items marked with an &lsquo;O&rsquo; in the above table are
        of the size specified in the <a href="#SizeOfOffsetsV0">Size
          of Offsets</a> field in the superblock.)
    </td></tr>
  </table>

</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Shared Object Header Message Table
    </caption>
	<tr>
      <th width="35%">Field Name</th>
      <th>Description</th>
    </tr>

    <tr>
      <td><p>Signature</p></td>
      <td>
        <p>The ASCII character string &ldquo;<code>SMTB</code>&rdquo;
          is used to indicate the beginning of the Shared Object
          Header Message table. This gives file consistency checking
          utilities a better chance of reconstructing a damaged file.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Version for index #N</p></td>
      <td>
        <p>This is the version number for the list of shared object header message
		  indexes and this document describes version 0.</p>
      </td>
    </tr>

    <tr>
      <td><p>Index Type for index #N</p></td>
      <td>
        <p>The type of index can be an unsorted list or a v2 B-tree.
        </p>
      </td>
    </tr>

	<tr>
      <td><p>Message Type Flags for index #N</p></td>
	  <td>
        <p>This field indicates the type of messages tracked in the index,
          as follows:
          <table class="list">
            <tr>
              <th width="20%" align="center">Bits</th>
              <th width="80%" align="left">Description</th>
            </tr>

            <tr>
              <td align="center"><code>0</code></td>
              <td>If set, the index tracks <em>Dataspace Messages</em>.
              </td>
            </tr>
            <tr>
              <td align="center"><code>1</code></td>
              <td>If set, the message tracks <em>Datatype Messages</em>.
              </td>
            </tr>
            <tr>
              <td align="center"><code>2</code></td>
              <td>If set, the message tracks <em>Fill Value Messages</em>.
              </td>
            </tr>
            <tr>
              <td align="center"><code>3</code></td>
              <td>If set, the message tracks <em>Filter Pipeline Messages</em>.
              </td>
            </tr>
            <tr>
              <td align="center"><code>4</code></td>
              <td>If set, the message tracks <em>Attribute Messages</em>.
              </td>
            </tr>
            <tr>
              <td align="center"><code>5-15</code></td>
              <td>Reserved (zero).
              </td>
            </tr>
        </table></p>


        <p>
          An index can track more than one type of message, but each type
          of message can only by in one index.
        </p>
      </td>
	</tr>

    <tr>
      <td><p>Minimum Message Size for index #N</p></td>
      <td>
	    <p>This is the message size sharing threshold for the index.
		  If the encoded size of the message is less than this value, the
          message is not shared.
        </p>
      </td>
    </tr>

	<tr>
	  <td><p>List Cutoff for index #N</p></td>
	  <td>
	    <p>This is the cutoff value for the indexing of messages to
          switch from a list to a v2 B-tree.  If the number of messages
          is greater than this value, the index should be a v2 B-tree.
        </p>
	  </td>
	</tr>
	<tr>
	  <td><p>v2 B-tree Cutoff for index #N</p></td>
	  <td>
        <p>This is the cutoff value for the indexing of messages
          to switch from a v2 B-tree back to a list. If the number
          of messages is less than this value, the index should be
          a list.
        </p>
	  </td>
    </tr>

    <tr>
      <td><p>Number of Messages for index #N</p></td>
      <td>
	    <p>The number of shared messages being tracked for the index.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Index Address for index #N</p></td>
      <td>
	    <p>This field is the address of the list or v2 B-tree where the
          index nodes reside.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Fractal Heap Address for index #N</p></td>
      <td>
	    <p>This field is the address of the fractal heap if shared messages
          are stored there.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Checksum</p></td>
      <td>
        <p>This is the checksum for the table.</p>
      </td>
    </tr>

  </table>
</div>

<br />
<p>
  Shared messages are indexed either with a <em>shared message record
    list</em>, described below, or using a v2 B-tree (using record type 7).
  The number of records in the <em>shared message record list</em> is
  determined in the index&rsquo;s entry in the <em>shared object header message
    table</em>.
</p>

<div align="center">
  <table class="format">
    <caption>
      Layout: Shared Message Record List
    </caption>

    <tr>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
    </tr>

    <tr>
      <td colspan="4">Signature</td>
    </tr>

    <tr>
      <td colspan="4">Shared Message Record #0</td>
    </tr>

    <tr>
      <td colspan="4">Shared Message Record #1</td>
    </tr>

    <tr>
      <td colspan="4">...</td>
    </tr>

    <tr>
      <td colspan="4">Shared Message Record #N-1</td>
    </tr>

    <tr>
      <td colspan="4">Checksum</td>
    </tr>
  </table>
</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Shared Message Record List
    </caption>
	<tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
    </tr>

    <tr>
      <td><p>Signature</p></td>
      <td>
        <p>The ASCII character string &ldquo;<code>SMLI</code>&rdquo;
          is used to indicate the beginning of a list of index nodes.
          This gives file consistency checking utilities a better
          chance of reconstructing a damaged file.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Shared Message Record #N</p></td>
      <td>
        <p>The record for locating the shared message, either in the
          fractal heap for the index, or an object header (see format for
          <em>index nodes</em> below).
	    </p>
      </td>
    </tr>

    <tr>
      <td><p>Checksum</p></td>
      <td>
        <p>This is the checksum for the list.
        </p>
      </td>
    </tr>

  </table>
</div>

<br />
<p>
  The record for each shared message in an index is stored in one
  of the following forms:
</p>

<div align="center">
  <table class="format">
    <caption>
      Layout: Shared Message Record for Messages Stored in a
      Fractal Heap
    </caption>

    <tr>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
    </tr>

    <tr>
      <td>Message Location</td>
      <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
    </tr>

    <tr>
      <td colspan="4">Hash Value</td>
    </tr>

    <tr>
      <td colspan="4">Reference Count</td>
    </tr>

    <tr>
      <td colspan="4"><br />Fractal Heap ID<br /><br /></td>
    </tr>
  </table>
</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Shared Message Record for Messages Stored in a
      Fractal Heap
    </caption>
	<tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
    </tr>

    <tr>
      <td><p>Message Location</p></td>
      <td>
        <p>This has a value of 0 indicating that the message is stored in
          the heap.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Hash Value</p></td>
      <td>
        <p>This is the hash value for the message.
	    </p>
      </td>
    </tr>

    <tr>
      <td><p>Reference Count</p></td>
      <td>
        <p>This is the number of times the message is used in the file.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Fractal Heap ID</p></td>
      <td>
	    <p>This is an 8-byte fractal heap ID for the message as stored in
          the fractal heap for the index.
        </p>
      </td>
    </tr>
  </table>
</div>

<br />
<br />
<br />
<div align="center">
  <table class="format">
    <caption>
      Layout: Shared Message Record for Messages Stored in an
      Object Header
    </caption>

    <tr>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
    </tr>

    <tr>
      <td>Message Location</td>
      <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
    </tr>

    <tr>
      <td colspan="4">Hash Value</td>
    </tr>

    <tr>
      <td>Reserved</td>
      <td>Message Type</td>
      <td colspan="2">Creation Index</td>
    </tr>

    <tr>
      <td colspan="4"><br />Object Header Address<sup>O</sup><br /><br /></td>
    </tr>
  </table>

  <table class="note">
    <tr>
      <td width="60%">&nbsp;</td>
      <td width="40%">
        (Items marked with an &lsquo;O&rsquo; in the above table are
        of the size specified in the <a href="#SizeOfOffsetsV0">Size
          of Offsets</a> field in the superblock.)
    </td></tr>
  </table>

</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Shared Message Record for Messages Stored in an
      Object Header
    </caption>
	<tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
    </tr>

    <tr>
      <td><p>Message Location</p></td>
      <td>
        <p>This has a value of 1 indicating that the message is stored in
          an object header.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Hash Value</p></td>
      <td>
        <p>This is the hash value for the message.
	    </p>
      </td>
    </tr>

    <tr>
      <td><p>Message Type</p></td>
      <td>
        <p>This is the message type in the object header.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Creation Index</p></td>
      <td>
	    <p>This is the creation index of the message within the object
          header.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Object Header Address</p></td>
      <td>
	    <p>This is the address of the object header where the message is
          located.
        </p>
      </td>
    </tr>
  </table>
</div>

<h2><a name="DataObject">
    IV. Disk Format: Level 2 - Data Objects </a></h2>

<p>Data objects contain the &ldquo;real&rdquo; user-visible information in the file.
  These objects compose the scientific data and other information which
  are generally thought of as &ldquo;data&rdquo; by the end-user.  All the
  other information in the file is provided as a framework for
  storing and accessing these data objects.
</p>

<p>A data object is composed of header and data
  information.  The header information contains the information
  needed to interpret the data information for the object as
  well as additional &ldquo;metadata&rdquo; or pointers to additional
  &ldquo;metadata&rdquo; used to describe or annotate each object.
</p>

<h3><a name="ObjectHeader">
    IV.A. Disk Format: Level 2A - Data Object Headers</a></h3>

<p>The header information of an object is designed to encompass
  all of the information about an object, except for the data itself.
  This information includes the dataspace, the datatype, information
  about how the data is stored on disk (in external files, compressed,
  broken up in blocks, and so on), as well as other information used
  by the library to speed up access to the data objects or maintain
  a file&rsquo;s integrity. Information stored by user applications
  as attributes is also stored in the object&rsquo;s header. The header
  of each object is not necessarily located immediately prior to the
  object&rsquo;s data in the file and in fact may be located in any
  position in the file. The order of the messages in an object header
  is not significant.</p>

<p>Object headers are composed of a prefix and a set of messages.  The
  prefix contains the information needed to interpret the messages and
  a small amount of metadata about the object, and the messages contain
  the majority of the metadata about the object.
</p>

<h3><a name="ObjectHeaderPrefix">
    IV.A.1. Disk Format: Level 2A1 - Data Object Header Prefix</a></h3>



<h4><a name="V1ObjectHeaderPrefix">
    IV.A.1.a. Version 1 Data Object Header Prefix</a></h4>

<p>Header messages are aligned on 8-byte boundaries for version 1
  object headers.
</p>

<div align="center">
  <table class="format">
    <caption>
      Layout: Version 1 Object Header
    </caption>

	<tr>
	  <th>byte</th>
	  <th>byte</th>
	  <th>byte</th>
	  <th>byte</th>
	</tr>

	<tr>
	  <td>Version</td>
	  <td>Reserved (zero)</td>
	  <td colspan="2">Total Number of Header Messages</td>
	</tr>

	<tr>
	  <td colspan="4">Object Reference Count</td>
	</tr>

	<tr>
	  <td colspan="4">Object Header Size</td>
	</tr>

	<tr>
	  <td colspan="4">Reserved (zero)</td>
	</tr>

	<tr>
	  <td colspan="2">Header Message Type #1</td>
	  <td colspan="2">Size of Header Message Data #1</td>
	</tr>

	<tr>
	  <td>Header Message #1 Flags</td>
	  <td colspan="3">Reserved (zero)</td>
	</tr>

	<tr>
	  <td colspan="4"><br />Header Message Data #1<br /><br /></td>
	</tr>

	<tr>
	  <td colspan="4">.<br />.<br />.<br /></td>
	</tr>

	<tr>
	  <td colspan="2">Header Message Type #n</td>
	  <td colspan="2">Size of Header Message Data #n</td>
	</tr>

	<tr>
	  <td>Header Message #n Flags</td>
	  <td colspan="3">Reserved (zero)</td>
	</tr>

	<tr>
	  <td colspan="4"><br />Header Message Data #n<br /><br /></td>
	</tr>
  </table>
</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Version 1 Object Header
    </caption>
	<tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
	</tr>

	<tr>
	  <td><p>Version</p></td>
	  <td>
        <p>This value is used to determine the format of the
          information in the object header.  When the format of the
          object header is changed, the version number
          is incremented and can be used to determine how the
          information in the object header is formatted.  This
          is version one (1) (there was no version zero (0)) of the
          object header.
        </p>
      </td>
	</tr>

	<tr>
	  <td><p>Total Number of Header Messages</p></td>
	  <td>
        <p>This value determines the total number of messages listed in
          object headers for this object.  This value includes the messages
          in continuation messages for this object.
        </p>
      </td>
	</tr>

	<tr>
	  <td><p>Object Reference Count</p></td>
	  <td>
        <p>This value specifies the number of &ldquo;hard links&rdquo; to this object
          within the current file.  References to the object from external
          files, &ldquo;soft links&rdquo; in this file and object references in this
          file are not tracked.
        </p>
      </td>
	</tr>

	<tr>
	  <td><p>Object Header Size</p></td>
	  <td>
        <p>This value specifies the number of bytes of header message data
          following this length field that contain object header messages
          for this object header.  This value does not include the size of
          object header continuation blocks for this object elsewhere in the
          file.
        </p>
      </td>
	</tr>

	<tr>
	  <td><p>Header Message #n Type</p></td>
	  <td>
        <p>This value specifies the type of information included in the
          following header message data.  The message types for
          header messages are defined in sections below.
        </p>
      </td>
	</tr>

	<tr>
	  <td><p>Size of Header Message #n Data</p></td>
	  <td>
        <p>This value specifies the number of bytes of header
          message data following the header message type and length
          information for the current message. The size includes
          padding bytes to make the message a multiple of eight
          bytes.
        </p>
      </td>
	</tr>

	<tr>
	  <td><p>Header Message #n Flags</p></td>
	  <td>
        <p>This is a bit field with the following definition:
          <table class="list">
            <tr>
              <th width="20%" align="center">Bit</th>
              <th width="80%" align="left">Description</th>
            </tr>

            <tr>
              <td align="center"><code>0</code></td>
              <td>If set, the message data is constant.  This is used
                for messages like the datatype message of a dataset.
              </td>
            </tr>
            <tr>
              <td align="center"><code>1</code></td>
              <td>If set, the message is <em>shared</em> and stored
                in another location than the object header.  The Header
                Message Data field contains a Shared Message
                (described in the <a href="#ObjectHeaderMessages">Data Object Header Messages</a>
                section below)
                and the Size of Header Message Data field
                contains the size of that Shared Message.
              </td>
            </tr>
            <tr>
              <td align="center"><code>2</code></td>
              <td>If set, the message should not be shared.
              </td>
            </tr>
            <tr>
              <td align="center"><code>3</code></td>
              <td>If set, the HDF5 decoder should fail to open this object
                if it does not understand the message&rsquo;s type and the file
                is open with permissions allowing write access to the file.
                (Normally, unknown messages can just be ignored by HDF5
                decoders)
              </td>
            </tr>
            <tr>
              <td align="center"><code>4</code></td>
              <td>If set, the HDF5 decoder should set bit 5 of this
                message&rsquo;s flags (in other words, this bit field)
                if it does not understand the message&rsquo;s type
                and the object is modified in any way. (Normally,
                unknown messages can just be ignored by HDF5
                decoders)
              </td>
            </tr>
            <tr>
              <td align="center"><code>5</code></td>
              <td>If set, this object was modified by software that did not
                understand this message.
                (Normally, unknown messages should just be ignored by HDF5
                decoders)  (Can be used to invalidate an index or a similar
                feature)
              </td>
            </tr>
            <tr>
              <td align="center"><code>6</code></td>
              <td>If set, this message is shareable.
              </td>
            </tr>
            <tr>
              <td align="center"><code>7</code></td>
              <td>If set, the HDF5 decoder should always fail to open this
                object if it does not understand the message&rsquo;s type (whether
                it is open for read-only or read-write access).  (Normally,
                unknown messages can just be ignored by HDF5 decoders)
              </td>
            </tr>
	    </table></p>

      </td>
    </tr>

	<tr>
	  <td><p>Header Message #n Data</p></td>
	  <td>
        <p>The format and length of this field is determined by the
          header message type and size respectively.  Some header
          message types do not require any data and this information
          can be eliminated by setting the length of the message to
          zero. The data is padded with enough zeroes to make the
          size a multiple of eight.
        </p>
      </td>
	</tr>
  </table>
</div>

<h4><a name="V2ObjectHeaderPrefix">
    IV.A.1.b. Version 2 Data Object Header Prefix</a></h4>

<p>Note that the &ldquo;total number of messages&rdquo; field has been dropped from
  the data object header prefix in this version.  The number of messages
  in the data object header is just determined by the messages encountered
  in all the object header blocks.</p>

<p>Note also that the fields and messages in this version of data object
  headers have <em>no</em> alignment or padding bytes inserted - they are
  stored packed together.</p>

<div align="center">
  <table class="format">
    <caption>
      Layout: Version 2 Object Header
    </caption>

	<tr>
	  <th>byte</th>
	  <th>byte</th>
	  <th>byte</th>
	  <th>byte</th>
	</tr>

	<tr>
	  <td colspan="4">Signature</td>
	</tr>
	<tr>
	  <td>Version</td>
	  <td>Flags</td>
      <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
	</tr>

	<tr>
	  <td colspan="4">Access time <em>(optional)</em></td>
	</tr>

	<tr>
	  <td colspan="4">Modification Time <em>(optional)</em></td>
	</tr>

	<tr>
	  <td colspan="4">Change Time <em>(optional)</em></td>
	</tr>

	<tr>
	  <td colspan="4">Birth Time <em>(optional)</em></td>
	</tr>

	<tr>
	  <td colspan="2">Maximum # of compact attributes <em>(optional)</em></td>
	  <td colspan="2">Minimum # of dense attributes <em>(optional)</em></td>
	</tr>

	<tr>
	  <td>Size of Chunk #0 <em>(variable size)</em></td>
      <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
	</tr>

	<tr>
	  <td>Header Message Type #1</td>
	  <td colspan="2">Size of Header Message Data #1</td>
	  <td>Header Message #1 Flags</td>
	</tr>

	<tr>
	  <td colspan="2">Header Message #1 Creation Order <em>(optional)</em></td>
      <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
	</tr>

	<tr>
	  <td colspan="4"><br />Header Message Data #1<br /><br /></td>
	</tr>

	<tr>
	  <td colspan="4">.<br />.<br />.<br /></td>
	</tr>

	<tr>
	  <td>Header Message Type #n</td>
	  <td colspan="2">Size of Header Message Data #n</td>
	  <td>Header Message #n Flags</td>
	</tr>

	<tr>
	  <td colspan="2">Header Message #n Creation Order <em>(optional)</em></td>
      <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
	</tr>

	<tr>
	  <td colspan="4"><br />Header Message Data #n<br /><br /></td>
	</tr>

	<tr>
	  <td colspan="4">Gap <em>(optional, variable size)</em></td>
	</tr>

	<tr>
	  <td colspan="4">Checksum</td>
	</tr>
  </table>
</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Version 2 Object Header
    </caption>
	<tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
	</tr>

	<tr>
	  <td><p>Signature</p></td>
	  <td>
        <p>The ASCII character string &ldquo;<code>OHDR</code>&rdquo;
          is used to indicate the beginning of an object header. This
          gives file consistency checking utilities a better chance
          of reconstructing a damaged file.
	    </p>
	  </td>
	</tr>

	<tr>
	  <td><p>Version</p></td>
	  <td>
        <p>This field has a value of 2 indicating version 2 of the object header.
        </p>
      </td>
	</tr>

	<tr>
	  <td><p>Flags</p></td>
	  <td>
        <p>This field is a bit field indicating additional information
          about the object header.
          <table class="list">
            <tr>
              <th width="20%" align="center">Bit(s)</th>
              <th width="80%" align="left">Description</th>
            </tr>

            <tr>
              <td align="center"><code>0-1</code></td>
              <td>This two bit field determines the size of the
                <em>Size of Chunk #0</em> field.  The values are:
                <table class="list">
                  <tr>
                    <th width="20%" align="center">Value</th>
                    <th width="80%" align="left">Description</th>
                  </tr>

                  <tr>
                    <td align="center"><code>0</code></td>
                    <td>The <em>Size of Chunk #0</em> field is 1 byte.
                    </td>
                  </tr>
                  <tr>
                    <td align="center"><code>1</code></td>
                    <td>The <em>Size of Chunk #0</em> field is 2 bytes.
                    </td>
                  </tr>
                  <tr>
                    <td align="center"><code>2</code></td>
                    <td>The <em>Size of Chunk #0</em> field is 4 bytes.
                    </td>
                  </tr>
                  <tr>
                    <td align="center"><code>3</code></td>
                    <td>The <em>Size of Chunk #0</em> field is 8 bytes.
                    </td>
                  </tr>
                </table>
              </td>
            </tr>
            <tr>
              <td align="center"><code>2</code></td>
              <td>If set, attribute creation order is tracked.</td>
            </tr>
            <tr>
              <td align="center"><code>3</code></td>
              <td>If set, attribute creation order is indexed.</td>
            </tr>
            <tr>
              <td align="center"><code>4</code></td>
              <td>If set, non-default attribute storage phase change
                values are stored.</td>
            </tr>
            <tr>
              <td align="center"><code>5</code></td>
              <td>If set, access, modification, change and birth times
                are stored.</td>
            </tr>
            <tr>
              <td align="center"><code>6-7</code></td>
              <td>Reserved</td>
            </tr>
	    </table></p>

      </td>
	</tr>

	<tr>
	  <td><p>Access Time</p></td>
	  <td>
        <p>This 32-bit value represents the number of seconds after the
          UNIX epoch when the object&rsquo;s raw data was last accessed
          (in other  words, read or written).
        </p>
	    <p>This field is present if bit 5 of <em>flags</em> is set.
        </p>
      </td>
	</tr>

	<tr>
	  <td><p>Modification Time</p></td>
	  <td>
        <p>This 32-bit value represents the number of seconds after
          the UNIX epoch when the object&rsquo;s raw data was last
          modified (in other words, written).
        </p>
	    <p>This field is present if bit 5 of <em>flags</em> is set.
        </p>
      </td>
	</tr>

	<tr>
	  <td><p>Change Time</p></td>
	  <td>
        <p>This 32-bit value represents the number of seconds after the
          UNIX epoch when the object&rsquo;s metadata was last changed.
        </p>
	    <p>This field is present if bit 5 of <em>flags</em> is set.
        </p>
      </td>
	</tr>

	<tr>
	  <td><p>Birth Time</p></td>
	  <td>
        <p>This 32-bit value represents the number of seconds after the
          UNIX epoch when the object was created.
        </p>
	    <p>This field is present if bit 5 of <em>flags</em> is set.
        </p>
      </td>
	</tr>

	<tr>
	  <td><p>Maximum # of compact attributes</p></td>
	  <td>
        <p>This is the maximum number of attributes to store in the compact
          format before switching to the indexed format.
        </p>
	    <p>This field is present if bit 4 of <em>flags</em> is set.
        </p>
      </td>
	</tr>

	<tr>
	  <td><p>Minimum # of dense attributes</p></td>
	  <td>
        <p>This is the minimum number of attributes to store in the indexed
          format before switching to the compact format.
        </p>
	    <p>This field is present if bit 4 of <em>flags</em> is set.
        </p>
      </td>
	</tr>

	<tr>
	  <td><p>Size of Chunk #0</p></td>
	  <td>
        <p>
          This unsigned value specifies the number of bytes of header
          message data following this field that contain object header
          information.
        </p>
        <p>
          This value does not include the size of object header
          continuation blocks for this object elsewhere in the file.
        </p>
        <p>
	      The length of this field varies depending on bits 0 and 1 of
	      the <em>flags</em> field.
        </p>
      </td>
	</tr>

	<tr>
	  <td><p>Header Message #n Type</p></td>
	  <td>
        <p>Same format as version 1 of the object header, described above.
        </p>
      </td>
	</tr>

	<tr>
	  <td><p>Size of Header Message #n Data</p></td>
	  <td>
        <p>This value specifies the number of bytes of header
          message data following the header message type and length
          information for the current message. The size of messages
          in this version does <em>not</em> include any padding bytes.
        </p>
      </td>
	</tr>

	<tr>
	  <td><p>Header Message #n Flags</p></td>
	  <td>
        <p>Same format as version 1 of the object header, described above.
        </p>
      </td>
    </tr>

	<tr>
	  <td><p>Header Message #n Creation Order</p></td>
	  <td>
        <p>This field stores the order that a message of a given type
          was created in.
        </p>
	    <p>This field is present if bit 2 of <em>flags</em> is set.
        </p>
      </td>
    </tr>

	<tr>
	  <td><p>Header Message #n Data</p></td>
	  <td>
        <p>Same format as version 1 of the object header, described above.
        </p>
      </td>
	</tr>

	<tr>
	  <td><p>Gap</p></td>
	  <td>
        <p>A gap in an object header chunk is inferred by the end of the
          messages for the chunk before the beginning of the chunk&rsquo;s
          checksum.  Gaps are always smaller than the size of an
          object header message prefix (message type + message size +
          message flags).
        </p>
        <p>Gaps are formed when a message (typically an attribute message)
          in an earlier chunk is deleted and a message from a later
          chunk that does not quite fit into the free space is moved
          into the earlier chunk.
        </p>
      </td>
	</tr>

    <tr>
      <td><p>Checksum</p></td>
      <td>
        <p>This is the checksum for the object header chunk.
        </p>
      </td>
    </tr>
  </table>
</div>

<p>The header message types and the message data associated with
  them compose the critical &ldquo;metadata&rdquo; about each object.  Some
  header messages are required for each object while others are
  optional.  Some optional header messages may also be repeated
  several times in the header itself, the requirements and number
  of times allowed in the header will be noted in each header
  message description below.
</p>


<h3><a name="ObjectHeaderMessages">
    IV.A.2. Disk Format: Level 2A2 - Data Object Header Messages</a></h3>

<p>Data object header messages are small pieces of metadata that are
  stored in the data object header for each object in an HDF5 file.
  Data object header messages provide the metadata required to describe
  an object and its contents, as well as optional pieces of metadata
  that annotate the meaning or purpose of the object.
</p>

<p>Data object header messages are either stored directly in the data
  object header for the object or are shared between multiple objects
  in the file.  When a message is shared, a flag in the <em>Message Flags</em>
  indicates that the actual <em>Message Data</em>
  portion of that message is stored in another location (such as another
  data object header, or a heap in the file) and the <em>Message Data</em>
  field contains the information needed to locate the actual information
  for the message.
</p>

<p>
  The format of shared message data is described here:</p>

<div align="center">
  <table class="format">
    <caption>
      Layout: Shared Message (Version 1)
    </caption>

	<tr>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	</tr>

	<tr>
	  <td>Version</td>
	  <td>Type</td>
	  <td colspan="2">Reserved (zero)</td>
	</tr>

	<tr>
	  <td colspan="4">Reserved (zero)</td>
	</tr>

	<tr>
	  <td colspan="4"><br />Address<sup>O</sup><br /><br /></td>
	</tr>
  </table>

  <table class="note">
    <tr>
      <td width="60%">&nbsp;</td>
      <td width="40%">
        (Items marked with an &lsquo;O&rsquo; in the above table are
        of the size specified in the <a href="#SizeOfOffsetsV0">Size
          of Offsets</a> field in the superblock.)
    </td></tr>
  </table>

</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Shared Message (Version 1)
    </caption>
	<tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
	</tr>

	<tr>
	  <td><p>Version</p></td>
	  <td><p>The version number is used when there are changes in the format
          of a shared object message and is described here:
	      <table class="list">
	        <tr>
		      <th width="20%" align="center">Version</th>
		      <th width="80%" align="left">Description</th>
	        </tr>

	        <tr>
		      <td align="center"><code>0</code></td>
		      <td>Never used.</td>
	        </tr>

	        <tr>
		      <td align="center"><code>1</code></td>
		      <td>Used by the library before version 1.6.1.
              </td>
	        </tr>
	    </table></p>
      </td>
	</tr>

	<tr>
	  <td><p>Type</p></td>
	  <td><p>The type of shared message location:
	      <table class="list">
	        <tr>
		      <th width="20%" align="center">Value</th>
		      <th width="80%" align="left">Description</th>
	        </tr>

	        <tr>
		      <td align="center"><code>0</code></td>
		      <td>Message stored in another object&rsquo;s header (a <em>committed</em>
                message).
              </td>
	        </tr>
	    </table></p>
      </td>
	</tr>

	<tr>
	  <td><p>Address</p></td>
	  <td><p>The address of the object header
          containing the message to be shared.</p>
      </td>
	</tr>
  </table>
</div>

<br />
<br />
<br />
<div align="center">
  <table class="format">

    <caption>
      Layout: Shared Message (Version 2)
    </caption>

	<tr>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	</tr>

	<tr>
	  <td>Version</td>
	  <td>Type</td>
      <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
	</tr>

	<tr>
	  <td colspan="4"><br />Address<sup>O</sup><br /><br /></td>
	</tr>
  </table>

  <table class="note">
    <tr>
      <td width="60%">&nbsp;</td>
      <td width="40%">
        (Items marked with an &lsquo;O&rsquo; in the above table are
        of the size specified in the <a href="#SizeOfOffsetsV0">Size
          of Offsets</a> field in the superblock.)
    </td></tr>
  </table>
</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Shared Message (Version 2)
    </caption>
	<tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
	</tr>

	<tr>
	  <td><p>Version</p></td>
	  <td><p>The version number is used when there are changes in the format
          of a shared object message and is described here:
	      <table class="list">
	        <tr>
		      <th width="20%" align="center">Version</th>
		      <th width="80%" align="left">Description</th>
	        </tr>

	        <tr>
		      <td align="center"><code>2</code></td>
		      <td>Used by the library of version 1.6.1 and after.
              </td>
	        </tr>
	    </table></p>
      </td>
	</tr>

	<tr>
	  <td><p>Type</p></td>
	  <td><p>The type of shared message location:
	      <table class="list">
	        <tr>
		      <th width="20%" align="center">Value</th>
		      <th width="80%" align="left">Description</th>
	        </tr>

	        <tr>
		      <td align="center"><code>0</code></td>
		      <td>Message stored in another object&rsquo;s header (a <em>committed</em>
                message).
              </td>
	        </tr>
	    </table></p>
      </td>
	</tr>

	<tr>
	  <td><p>Address</p></td>
	  <td><p>The address of the object header
          containing the message to be shared.</p></td>
	</tr>
  </table>
</div>

<br />
<br />
<br />
<div align="center">
  <table class="format">
    <caption>
      Layout: Shared Message (Version 3)
    </caption>

	<tr>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	</tr>

	<tr>
	  <td>Version</td>
	  <td>Type</td>
      <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
	</tr>

	<tr>
	  <td colspan="4">Location <em>(variable size)</em></td>
	</tr>
  </table>
</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Shared Message (Version 3)
    </caption>
	<tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
	</tr>

	<tr>
	  <td><p>Version</p></td>
	  <td><p>The version number indicates changes in the format of shared
	      object message and is described here:
	      <table class="list">
	        <tr>
		      <th width="20%" align="center">Version</th>
		      <th width="80%" align="left">Description</th>
	        </tr>

	        <tr>
		      <td align="center"><code>3</code></td>
		      <td>Used by the library of version 1.8 and after.  In this
                version, the <em>Type</em> field can indicate that
                the message is stored in the fractal heap.
              </td>
	        </tr>
	    </table></p>
      </td>
	</tr>

	<tr>
	  <td><p>Type</p></td>
	  <td><p>The type of shared message location:
	      <table class="list">
	        <tr>
		      <th width="20%" align="center">Value</th>
		      <th width="80%" align="left">Description</th>
	        </tr>

	        <tr>
		      <td align="center"><code>0</code></td>
		      <td>Message is not shared and is not shareable.
              </td>
	        </tr>

	        <tr>
		      <td align="center"><code>1</code></td>
		      <td>Message stored in file&rsquo;s <em>shared object header message</em>
                heap (a <em>shared</em> message).
              </td>
	        </tr>

	        <tr>
		      <td align="center"><code>2</code></td>
		      <td>Message stored in another object&rsquo;s header (a <em>committed</em>
                message).
              </td>
	        </tr>

	        <tr>
		      <td align="center"><code>3</code></td>
		      <td>Message stored is not shared, but is shareable.
              </td>
	        </tr>

	    </table></p>
      </td>
	</tr>

	<tr>
	  <td><p>Location</p></td>
	  <td><p>This field contains either a <a href="#SizeOfOffsetsV0">
            <em>Size of Offsets</em></a>-bytes address of the object header
          containing the message to be shared, or an 8-byte fractal heap
          ID for the message in the file&rsquo;s <em>shared object header
            message</em> heap.
	    </p>
      </td>
	</tr>
  </table>
</div>


<p>The following is a list of currently defined header messages:
</p>

<h4><a name="NILMessage">IV.A.2.a. The NIL Message</a></h4>

<!-- start msgdesc table -->
<center>
  <table class="msgdesc">
    <tr><td colspan="2"><b>Header Message Name:</b> NIL</td></tr>
    <tr><td colspan="2"><b>Header Message Type:</b> 0x0000</td></tr>
    <tr><td colspan="2"><b>Length:</b> Varies</td></tr>
    <tr><td colspan="2"><b>Status:</b> Optional; may be repeated.</td></tr>
    <tr><td><b>Description:</b></td>
      <td>The NIL message is used to indicate a message which is to be
        ignored when reading the header messages for a data object.
        [Possibly one which has been deleted for some reason.]
    </td></tr>
    <tr><td colspan="2"><b>Format of Data:</b> Unspecified</td></tr>
</table></center>
<!-- end msgdesc table -->


<h4><a name="DataspaceMessage">IV.A.2.b. The Dataspace Message</a></h4>

<!-- start msgdesc table -->
<center>
  <table class="msgdesc">
    <tr><td colspan="2"><b>Header Message Name:</b> Dataspace</td></tr>
    <tr><td colspan="2"><b>Header Message Type:</b> 0x0001</td></tr>
    <tr><td colspan="2"><b>Length:</b> Varies according to the number of
        dimensions, as described in the following table.</td></tr>
    <tr><td colspan="2"><b>Status:</b> Required for dataset objects;
        may not be repeated.</td></tr>
    <tr><td><b>Description:</b></td>
      <td>The dataspace message describes the number of dimensions (in
        other words, &ldquo;rank&rdquo;) and size of each dimension that
        the data object has. This message is only used for datasets which
        have a simple, rectilinear, array-like layout; datasets requiring
        a more complex layout are not yet supported.
      </td>
    </tr>

    <tr><td colspan="2"><b>Format of Data:</b> See the tables
        below.</td></tr>
</table></center>
<!-- end msgdesc table -->

<div align="center">
  <table class="format">
    <caption>
      Layout: Dataspace Message - Version 1
    </caption>

	<tr>
	  <th>byte</th>
	  <th>byte</th>
	  <th>byte</th>
	  <th>byte</th>
	</tr>

	<tr>
	  <td>Version</td>
	  <td>Dimensionality</td>
	  <td>Flags</td>
	  <td>Reserved</td>
	</tr>

	<tr>
	  <td colspan="4">Reserved</td>
	</tr>

	<tr>
	  <td colspan="4"><br />Dimension #1 Size<sup>L</sup><br /><br /></td>
    </tr>
	<tr>
	  <td colspan="4">.<br />.<br />.<br /></td>
	</tr>
	<tr>
	  <td colspan="4"><br />Dimension #n Size<sup>L</sup><br /><br /></td>
	</tr>
	<tr>
	  <td colspan="4"><br />Dimension #1 Maximum Size<sup>L</sup> <em>(optional)</em><br /><br /></td>
	</tr>
	<tr>
	  <td colspan="4">.<br />.<br />.<br /></td>
	</tr>
	<tr>
	  <td colspan="4"><br />Dimension #n Maximum Size<sup>L</sup> <em>(optional)</em><br /><br /></td>
	</tr>
	<tr>
	  <td colspan="4"><br />Permutation Index #1<sup>L</sup> <em>(optional)</em><br /><br /></td>
	</tr>
	<tr>
	  <td colspan="4">.<br />.<br />.<br /></td>
	</tr>
	<tr>
	  <td colspan="4"><br />Permutation Index #n<sup>L</sup> <em>(optional)</em><br /><br /></td>
    </tr>
  </table>

  <table class="note">
    <tr>
      <td width="60%">&nbsp;</td>
      <td width="40%">
        (Items marked with an &lsquo;L&rsquo; in the above table are
        of the size specified in the <a href="#SizeOfLengthsV0">Size
          of Lengths</a> field in the superblock.)
    </td></tr>
  </table>
</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Dataspace Message - Version 1
    </caption>
	<tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
	</tr>

	<tr>
	  <td><p>Version</p></td>
	  <td>
        <p>This value is used to determine the format of the
	      Dataspace Message.  When the format of the
	      information in the message is changed, the version number
	      is incremented and can be used to determine how the
	      information in the object header is formatted.  This
          document describes version one (1) (there was no version
          zero (0)).
        </p>
      </td>
	</tr>

	<tr>
	  <td><p>Dimensionality</p></td>
	  <td>
        <p>This value is the number of dimensions that the data
	      object has.
        </p>
      </td>
	</tr>

	<tr>
	  <td><p>Flags</p></td>
	  <td>
        <p>This field is used to store flags to indicate the
	      presence of parts of this message.  Bit 0 (the least
	      significant bit) is used to indicate that maximum
	      dimensions are present.  Bit 1 is used to indicate that
	      permutation indices are present.
        </p>
      </td>
	</tr>

	<tr>
	  <td><p>Dimension #n Size</p></td>
	  <td>
        <p>This value is the current size of the dimension of the
	      data as stored in the file.  The first dimension stored in
	      the list of dimensions is the slowest changing dimension
	      and the last dimension stored is the fastest changing
	      dimension.
        </p>
      </td>
	</tr>

	<tr>
	  <td><p>Dimension #n Maximum Size</p></td>
	  <td>
        <p>This value is the maximum size of the dimension of the
	      data as stored in the file.  This value may be the special
          &ldquo;<a href="#UnlimitedDim">unlimited</a>&rdquo; size which indicates
	      that the data may expand along this dimension indefinitely.
          If these values are not stored, the maximum size of each
          dimension is assumed to be the dimension&rsquo;s current size.
        </p>
      </td>
	</tr>

	<tr>
	  <td><p>Permutation Index #n</p></td>
	  <td>
        <p>This value is the index permutation used to map
	      each dimension from the canonical representation to an
	      alternate axis for each dimension.  If these values are
	      not stored, the first dimension stored in the list of
	      dimensions is the slowest changing dimension and the last
	      dimension stored is the fastest changing dimension.
        </p>
      </td>
	</tr>
  </table>
</div>



<br />
<p>Version 2 of the dataspace message dropped the optional
  permutation index value support, as it was never implemented in the
  HDF5 Library:</p>

<div align="center">
  <table class="format">
    <caption>
      Layout: Dataspace Message - Version 2
    </caption>

	<tr>
	  <th>byte</th>
	  <th>byte</th>
	  <th>byte</th>
	  <th>byte</th>
	</tr>

	<tr>
	  <td>Version</td>
	  <td>Dimensionality</td>
	  <td>Flags</td>
	  <td>Type</td>
	</tr>

	<tr>
	  <td colspan="4"><br />Dimension #1 Size<sup>L</sup><br /><br /></td>
    </tr>
	<tr>
	  <td colspan="4">.<br />.<br />.<br /></td>
    </tr>
	<tr>
	  <td colspan="4"><br />Dimension #n Size<sup>L</sup><br /><br /></td>
    </tr>
	<tr>
	  <td colspan="4"><br />Dimension #1 Maximum Size<sup>L</sup> <em>(optional)</em><br /><br /></td>
    </tr>
	<tr>
	  <td colspan="4">.<br />.<br />.<br /></td>
    </tr>
	<tr>
	  <td colspan="4"><br />Dimension #n Maximum Size<sup>L</sup> <em>(optional)</em><br /><br /></td>
    </tr>
  </table>

  <table class="note">
    <tr>
      <td width="60%">&nbsp;</td>
      <td width="40%">
        (Items marked with an &lsquo;L&rsquo; in the above table are
        of the size specified in the <a href="#SizeOfLengthsV0">Size
          of Lengths</a> field in the superblock.)
    </td></tr>
  </table>
</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Dataspace Message - Version 2
    </caption>
	<tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
	</tr>

	<tr>
	  <td><p>Version</p></td>
	  <td>
        <p>This value is used to determine the format of the
          Dataspace Message.  This field should be &lsquo;2&rsquo; for version 2
          format messages.
        </p>
      </td>
	</tr>

	<tr>
	  <td><p>Dimensionality</p></td>
	  <td>
        <p>This value is the number of dimensions that the data object has.
        </p>
      </td>
	</tr>

	<tr>
	  <td><p>Flags</p></td>
	  <td>
        <p>This field is used to store flags to indicate the
          presence of parts of this message.  Bit 0 (the least
          significant bit) is used to indicate that maximum
          dimensions are present.
        </p>
      </td>
	</tr>

	<tr>
	  <td><p>Type</p></td>
	  <td>
        <p>This field indicates the type of the dataspace:
          <table class="list">
            <tr>
              <th width="20%" align="center">Value</th>
              <th width="80%" align="left">Description</th>
            </tr>

            <tr>
              <td align="center"><code>0</code></td>
              <td>A <em>scalar</em> dataspace; in other words,
                a dataspace with a single, dimensionless element.
              </td>
            </tr>
            <tr>
              <td align="center"><code>1</code></td>
              <td>A <em>simple</em> dataspace; in other words,
                a dataspace with a rank greater than 0 and an
                appropriate number of dimensions.
              </td>
            </tr>
            <tr>
              <td align="center"><code>2</code></td>
              <td>A <em>null</em> dataspace; in other words,
                a dataspace with no elements.
              </td>
            </tr>
        </table></p>
      </td>
	</tr>

	<tr>
	  <td><p>Dimension #n Size</p></td>
	  <td>
        <p>This value is the current size of the dimension of the
          data as stored in the file.  The first dimension stored in
          the list of dimensions is the slowest changing dimension
          and the last dimension stored is the fastest changing
          dimension.
        </p>
      </td>
	</tr>

	<tr>
	  <td><p>Dimension #n Maximum Size</p></td>
	  <td>
        <p>This value is the maximum size of the dimension of the
          data as stored in the file.  This value may be the special
          &ldquo;<a href="#UnlimitedDim">unlimited</a>&rdquo; size which indicates
          that the data may expand along this dimension indefinitely.
          If these values are not stored, the maximum size of each
          dimension is assumed to be the dimension&rsquo;s current size.
        </p>
      </td>
	</tr>

  </table>
</div>



<!--
    <h4><a name="DataSpaceMessage">Header Message Name: Complex Dataspace (Fiber Bundle?)</a></h4>

    <!-- start msgdesc table --
         <center>
           <table class="msgdesc">
             <p><b>Header Message Name: ???????</b></td></tr>
<b>Header Message Type: </b>0x0002<br />
<b>Length:</b> Varies</td></tr>

<b>Status:</b> One of the <em>Simple Dataspace</em> or
<em>Complex Dataspace</em> messages is required (but not both) and may
not be repeated.<br /> <b>Description:</b> The
<em>Dataspace</em> message describes space that the dataset is
mapped onto in a more comprehensive way than the <em>Simple
  Dimensionality</em> message is capable of handling.  The
dataspace of a dataset encompasses the type of coordinate system
used to locate the dataset&rsquo;s elements as well as the structure and
regularity of the coordinate system.  The dataspace also
describes the number of dimensions which the dataset inhabits as
well as a possible higher dimensional space in which the dataset
is located within.

<br />
<p><b>Format of Data:</b></p>

<center>
  <table border cellpadding="4" width="80%">
	<caption align="bottom">
	  <b>HDF5 Dataspace Message Layout</b>
    </caption>

	<tr align="center">
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
    </tr>

	<tr align="center">
	  <td colspan="4">Mesh Type</td>
    </tr>
	<tr align="center">
	  <td colspan="4">Logical Dimensionality</td>
    </tr>
  </table>
</center>

<br />
<dl>
  <dt>The elements of the dimensionality message are described below:
    <dd>
	  <dl>
	    <dt>Mesh Type: (unsigned 32-bit integer)
	      <dd>This value indicates whether the grid is
	        polar/spherical/cartesion,
	        structured/unstructured and regular/irregular. <br />
	        The mesh type value is broken up as follows: <br />

	        <br />
	        <center>
	          <table border cellpadding="4" width="80%">
		        <caption align="bottom">
		          <b>HDF5 Mesh-type Layout</b>
	            </caption>

		        <tr align="center">
		          <th width="25%">byte</th>
		          <th width="25%">byte</th>
		          <th width="25%">byte</th>
		          <th width="25%">byte</th>
                </tr>

		        <tr align="center">
		          <td colspan="1">Mesh Embedding</td>
		          <td colspan="1">Coordinate System</td>
		          <td colspan="1">Structure</td>
		          <td colspan="1">Regularity</td>
                </tr>
	          </table>
	        </center>
	        The following are the definitions of mesh-type bytes:
	        <dl>
	          <dt>Mesh Embedding
	            <dd>This value indicates whether the dataset dataspace
		          is located within
		          another dataspace or not:
		          <dl> <dl>
		              <dt>&lt;STANDALONE&gt;
		                <dd>The dataset mesh is self-contained and is not
		                  embedded in another mesh.
		                  <dt>&lt;EMBEDDED&gt;
		                    <dd>The dataset&rsquo;s dataspace is located within
		                      another dataspace, as
		                      described in information below.
		          </dl> </dl>
	              <dt>Coordinate System
	                <dd>This value defines the type of coordinate system
		              used for the mesh:
		              <dl> <dl>
		                  <dt>&lt;POLAR&gt;
		                    <dd>The last two dimensions are in polar
		                      coordinates, higher dimensions are
		                      cartesian.
		                      <dt>&lt;SPHERICAL&gt;
		                        <dd>The last three dimensions are in spherical
		                          coordinates, higher dimensions
		                          are cartesian.
		                          <dt>&lt;CARTESIAN&gt;
		                            <dd>All dimensions are in cartesian coordinates.
		              </dl> </dl>
	                  <dt>Structure
	                    <dd>This value defines the locations of the grid-points
		                  on the axes:
		                  <dl> <dl>
		                      <dt>&lt;STRUCTURED&gt;
		                        <dd>All grid-points are on integral, sequential
		                          locations, starting from 0.
		                          <dt>&lt;UNSTRUCTURED&gt;
		                            <dd>Grid-points locations in each dimension are
		                              explicitly defined and
		                              may be of any numeric datatype.
		                  </dl> </dl>
	                      <dt>Regularity
	                        <dd>This value defines the locations of the dataset
		                      points on the grid:
		                      <dl> <dl>
		                          <dt>&lt;REGULAR&gt;
		                            <dd>All dataset elements are located at the
		                              grid-points defined.
		                              <dt>&lt;IRREGULAR&gt;
		                                <dd>Each dataset element has a particular
		                                  grid-location defined.
		                      </dl> </dl>
	        </dl>
	        <p>The following grid combinations are currently allowed:</p>
	        <dl> <dl>
		        <dt>&lt;POLAR-STRUCTURED-REGULAR&gt;
		        <dt>&lt;SPHERICAL-STRUCTURED-REGULAR&gt;
		        <dt>&lt;CARTESIAN-STRUCTURED-REGULAR&gt;
		        <dt>&lt;POLAR-UNSTRUCTURED-REGULAR&gt;
		        <dt>&lt;SPHERICAL-UNSTRUCTURED-REGULAR&gt;
		        <dt>&lt;CARTESIAN-UNSTRUCTURED-REGULAR&gt;
		        <dt>&lt;CARTESIAN-UNSTRUCTURED-IRREGULAR&gt;
	        </dl> </dl>
	        All of the above grid types can be embedded within another
	        dataspace.
	        <br /> <br />
	        <dt>Logical Dimensionality: (unsigned 32-bit integer)
	          <dd>This value is the number of dimensions that the dataset occupies.

	            <br />
	            <center>
	              <table border cellpadding="4" width="80%">
		            <caption align="bottom">
		              <b>HDF5 Dataspace Embedded Dimensionality Information</b>
	                </caption>

		            <tr align="center">
		              <th width="25%">byte</th>
		              <th width="25%">byte</th>
		              <th width="25%">byte</th>
		              <th width="25%">byte</th>
                    </tr>

		            <tr align="center">
		              <td colspan="4">Embedded Dimensionality</td>
                    </tr>
		            <tr align="center">
		              <td colspan="4">Embedded Dimension Size #1</td>
                    </tr>
		            <tr align="center">
		              <td colspan="4">.<br />.<br />.<br /></td>
                    </tr>
		            <tr align="center">
		              <td colspan="4">Embedded Dimension Size #n</td>
                    </tr>
		            <tr align="center">
		              <td colspan="4">Embedded Origin Location #1</td>
                    </tr>
		            <tr align="center">
		              <td colspan="4">.<br />.<br />.<br /></td>
                    </tr>
		            <tr align="center">
		              <td colspan="4">Embedded Origin Location #n</td>
                    </tr>
	              </table>
	            </center>

	            <dt>Embedded Dimensionality: (unsigned 32-bit integer)
	              <dd>This value is the number of dimensions of the space the
	                dataset is located within: in other words, a planar dataset
                    located within a 3-D space, a 3-D dataset
	                which is a subset of another 3-D space, and so on.
	                <dt>Embedded Dimension Size: (unsigned 32-bit integer)
	                  <dd>These values are the sizes of the dimensions of the
	                    embedded dataspace
	                    that the dataset is located within.
	                    <dt>Embedded Origin Location: (unsigned 32-bit integer)
	                      <dd>These values comprise the location of the dataset&rsquo;s
	                        origin within the embedded dataspace.
	  </dl>
</dl>
[Comment: need some way to handle different orientations of the
dataset dataspace
within the embedded dataspace]<br />

<br />
<center>
  <table border cellpadding="4" width="80%">
	<caption align="bottom">
	  <b>HDF5 Dataspace Structured/Regular Grid Information</b>
    </caption>

	<tr align="center">
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
    </tr>

	<tr align="center">
	  <td colspan="4">Logical Dimension Size #1</td>
    </tr>
	<tr align="center">
	  <td colspan="4">Logical Dimension Maximum #1</td>
    </tr>
	<tr align="center">
	  <td colspan="4">.<br />.<br />.<br /></td>
    </tr>
	<tr align="center">
	  <td colspan="4">Logical Dimension Size #n</td>
    </tr>
	<tr align="center">
	  <td colspan="4">Logical Dimension Maximum #n</td>
    </tr>
  </table>
</center>

<br />
<dl>
  <dt>The elements of the dimensionality message are described below:
    <dd>
	  <dl>
	    <dt>Logical Dimension Size #n: (unsigned 32-bit integer)
	      <dd>This value is the current size of the dimension of the
	        data as stored in
	        the file.  The first dimension stored in the list of
	        dimensions is the slowest
	        changing dimension and the last dimension stored is the
	        fastest changing
	        dimension.
	        <dt>Logical Dimension Maximum #n: (unsigned 32-bit integer)
	          <dd>This value is the maximum size of the dimension of the
	            data as stored in
	            the file.  This value may be the special value
	            &lt;UNLIMITED&gt; which
	            indicates that the data may expand along this dimension
	            indefinitely.
	  </dl>
</dl>
<br />
<center>
  <table border cellpadding="4" width="80%">
	<caption align="bottom">
	  <b>HDF5 Dataspace Structured/Irregular Grid Information</b>
    </caption>

	<tr align="center">
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
    </tr>

	<tr align="center">
	  <td colspan="4"># of Grid Points in Dimension #1</td>
    </tr>
	<tr align="center">
	  <td colspan="4">.<br />.<br />.<br /></td>
    </tr>
	<tr align="center">
	  <td colspan="4"># of Grid Points in Dimension #n</td>
    </tr>
	<tr align="center">
	  <td colspan="4">Datatype of Grid Point Locations</td>
    </tr>
	<tr align="center">
	  <td colspan="4">Location of Grid Points in Dimension #1</td>
    </tr>
	<tr align="center">
	  <td colspan="4">.<br />.<br />.<br /></td>
    </tr>
	<tr align="center">
	  <td colspan="4">Location of Grid Points in Dimension #n</td>
    </tr>
  </table>
</center>

<br />
<center>
  <table border cellpadding="4" width="80%">
	<caption align="bottom">
	  <b>HDF5 Dataspace Unstructured Grid Information</b>
    </caption>

	<tr align="center">
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
    </tr>

	<tr align="center">
	  <td colspan="4"># of Grid Points</td>
    </tr>
	<tr align="center">
	  <td colspan="4">Datatype of Grid Point Locations</td>
    </tr>
	<tr align="center">
	  <td colspan="4">Grid Point Locations<br />.<br />.<br /></td>
    </tr>
  </table>
</center>
-->

<h4><a name="LinkInfoMessage">IV.A.2.c. The Link Info Message</a></h4>

<!-- start msgdesc table -->
<center>
  <table class="msgdesc">
    <tr><td colspan="2"><b>Header Message Name:</b> Link Info</td></tr>
    <tr><td colspan="2"><b>Header Message Type:</b> 0x002 </td></tr>
    <tr><td colspan="2"><b>Length:</b> Varies </td></tr>
    <tr><td colspan="2"><b>Status:</b> Optional; may not be
        repeated. </td></tr>
    <tr><td><b>Description:</b></td>
      <td>The link info message tracks variable information about the
        current state of the links for a &ldquo;new style&rdquo;
        group&rsquo;s behavior. Variable information will be stored in
        this message and constant information will be stored in the
        <a href="#GroupInfoMessage">Group Info</a> message.
    </td></tr>
    <tr><td colspan="2"><b>Format of Data:</b> See the tables
        below.</td></tr>
</table></center>
<!-- end msgdesc table -->

<div align="center">
  <table class="format">
    <caption>
      Layout: Link Info
    </caption>

	<tr>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	</tr>

	<tr>
	  <td>Version</td>
	  <td>Flags</td>
      <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
	</tr>

	<tr>
	  <td colspan="4"><br />Maximum Creation Index <em>(8 bytes, optional)</em><br /><br /></td>
	</tr>

	<tr>
	  <td colspan="4"><br />Fractal Heap Address<sup>O</sup><br /><br /></td>
	</tr>

	<tr>
	  <td colspan="4"><br />Address of v2 B-tree for Name Index<sup>O</sup><br /><br /></td>
	</tr>

	<tr>
	  <td colspan="4"><br />Address of v2 B-tree for Creation Order Index<sup>O</sup> <em>(optional)</em><br /><br /></td>
	</tr>

  </table>

  <table class="note">
    <tr>
      <td width="60%">&nbsp;</td>
      <td width="40%">
        (Items marked with an &lsquo;O&rsquo; in the above table are
        of the size specified in the <a href="#SizeOfOffsetsV0">Size
          of Offsets</a> field in the superblock.)
    </td></tr>
  </table>
</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Link Info
    </caption>
	<tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
	</tr>

	<tr>
	  <td><p>Version</p></td>
	  <td>
        <p>The version number for this message. This document describes
          version 0.</p>
	  </td>
	</tr>

	<tr>
	  <td><p>Flags</p></td>
	  <td><p>This field determines various optional aspects of the link
          info message:

          <table class="list">
            <tr>
              <th width="20%" align="center">Bit</th>
              <th width="80%" align="left">Description</th>
            </tr>

            <tr>
              <td align="center"><code>0</code></td>
              <td>If set, creation order for the links is tracked.
              </td>
            </tr>
            <tr>
              <td align="center"><code>1</code></td>
              <td>If set, creation order for the links is indexed.
              </td>
            </tr>
            <tr>
              <td align="center"><code>2-7</code></td>
              <td>Reserved</td>
            </tr>
	    </table></p>

      </td>
	</tr>

	<tr>
	  <td><p>Maximum Creation Index</p></td>
	  <td><p>This 64-bit value is the maximum creation order index value
          stored for a link in this group.</p>
	    <p>This field is present if bit 0 of <em>flags</em> is set.</p>
	  </td>
	</tr>

	<tr>
	  <td><p>Fractal Heap Address</p></td>
	  <td>
        <p>
          This is the address of the fractal heap to store dense links.
          Each link stored in the fractal heap is stored as a
          <a href="#LinkMessage">Link Message</a>.
        </p>
        <p>
          If there are no links in the group, or the group&rsquo;s links
          are stored &ldquo;compactly&rdquo; (as object header messages), this
          value will be the <a href="#UndefinedAddress">undefined
            address</a>.
        </p>
	  </td>
	</tr>

	<tr>
	  <td><p>Address of v2 B-tree for Name Index</p></td>
	  <td><p>This is the address of the version 2 B-tree to index names of links.</p>
        <p>If there are no links in the group, or the group&rsquo;s links
          are stored &ldquo;compactly&rdquo; (as object header messages), this
          value will be the <a href="#UndefinedAddress">undefined
            address</a>.
        </p>
	  </td>
	</tr>

	<tr>
	  <td><p>Address of v2 B-tree for Creation Order Index</p></td>
	  <td><p>This is the address of the version 2 B-tree to index creation order of links.</p>
        <p>If there are no links in the group, or the group&rsquo;s links
          are stored &ldquo;compactly&rdquo; (as object header messages), this
          value will be the <a href="#UndefinedAddress">undefined
            address</a>.
        </p>
	    <p>This field exists if bit 1 of <em>flags</em> is set.</p>
	  </td>
	</tr>

  </table>
</div>


<h4><a name="DatatypeMessage">IV.A.2.d. The Datatype Message</a></h4>

<!-- start msgdesc table -->
<center>
  <table class="msgdesc">
    <tr><td colspan="2"><b>Header Message Name:</b> Datatype</td></tr>
    <tr><td colspan="2"><b>Header Message Type:</b> 0x0003
    </td></tr>
    <tr><td colspan="2"><b>Length:</b> Variable</td></tr>
    <tr><td colspan="2"><b>Status:</b> Required for dataset or committed
        datatype (formerly named datatype) objects; may not be repeated.
    </td></tr>
    <tr><td><b>Description:</b></td>
      <td><p>The datatype message defines the datatype for each element
          of a dataset or a common datatype for sharing between multiple
          datasets.  A datatype can describe an atomic type like a fixed-
          or floating-point type or more complex types like a C struct
          (compound datatype), array (array datatype), or C++ vector
          (variable-length datatype).</p>
        <p>Datatype messages that are part of a dataset object do not
          describe how elements are related to one another; the dataspace
          message is used for that purpose. Datatype messages that are part of
          a committed datatype (formerly named datatype) message describe
          a common datatype that can be shared by multiple datasets in the
          file.</p>
    </td></tr>
    <tr><td colspan="2"><b>Format of Data:</b> See the tables
        below.</td></tr>
</table></center>
<!-- end msgdesc table -->

<div align="center">
  <table class="format">
    <caption>
      Layout: Datatype Message
    </caption>

	<tr>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	</tr>

	<tr>
	  <td>Class and Version</td>
	  <td>Class Bit Field, Bits 0-7</td>
	  <td>Class Bit Field, Bits 8-15</td>
	  <td>Class Bit Field, Bits 16-23</td>
	</tr>

	<tr>
	  <td colspan="4">Size</td>
	</tr>

	<tr>
	  <td colspan="4"><br /><br />Properties<br /><br /><br /></td>
	</tr>
  </table>
</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Datatype Message
    </caption>
	<tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
	</tr>

	<tr>
	  <td><p>Class and Version</p></td>
	  <td>
        <p>The version of the datatype message and the datatype&rsquo;s class
          information are packed together in this field.  The version
          number is packed in the top 4 bits of the field and the class
          is contained in the bottom 4 bits.
        </p>
        <p>The version number information is used for changes in the
          format of the datatype message and is described here:
          <table class="list">
            <tr>
              <th width="20%" align="center">Version</th>
              <th width="80%" align="left">Description</th>
            </tr>

            <tr>
              <td align="center"><code>0</code></td>
              <td>Never used
              </td>
            </tr>
            <tr>
              <td align="center"><code>1</code></td>
              <td>Used by early versions of the library to encode
                compound datatypes with explicit array fields.
                See the compound datatype description below for
                further details.
              </td>
            </tr>
            <tr>
              <td align="center"><code>2</code></td>
              <td>Used when an array datatype needs to be encoded.
              </td>
            </tr>
            <tr>
              <td align="center"><code>3</code></td>
              <td>Used when a VAX byte-ordered type needs to be
                encoded.  Packs various other datatype classes more
                efficiently also.
              </td>
            </tr>
            <tr>
              <td align="center"><code>4</code></td>
              <td>Used to encode the revised reference datatype.
              </td>
            </tr>
        </table></p>

        <p>The class of the datatype determines the format for the class
          bit field and properties portion of the datatype message, which
          are described below.  The
          following classes are currently defined:

          <table class="list">
            <tr>
              <th width="20%" align="center">Value</th>
              <th width="80%" align="left">Description</th>
            </tr>

            <tr>
              <td align="center"><code>0</code></td>
              <td><a href="#ClassFixedPoint">Fixed-Point</a></td>
            </tr>

            <tr>
              <td align="center"><code>1</code></td>
              <td><a href="#ClassFloatingPoint">Floating-Point</a></td>
            </tr>

            <tr>
              <td align="center"><code>2</code></td>
              <td> <a href="#ClassTime">Time</a></td>
            </tr>

            <tr>
              <td align="center"><code>3</code></td>
              <td><a href="#ClassString">String</a></td>
            </tr>

            <tr>
              <td align="center"><code>4</code></td>
              <td><a href="#ClassBitField">Bit field</a></td>
            </tr>

            <tr>
              <td align="center"><code>5</code></td>
              <td><a href="#ClassOpaque">Opaque</a></td>
            </tr>

            <tr>
              <td align="center"><code>6</code></td>
              <td><a href="#ClassCompound">Compound</a></td>
            </tr>

            <tr>
              <td align="center"><code>7</code></td>
              <td><a href="#ClassReference">Reference</a></td>
            </tr>

            <tr>
              <td align="center"><code>8</code></td>
              <td><a href="#ClassEnum">Enumerated</a></td>
            </tr>

            <tr>
              <td align="center"><code>9</code></td>
              <td><a href="#ClassVarLen">Variable-Length</a></td>
            </tr>

            <tr>
              <td align="center"><code>10</code></td>
              <td><a href="#ClassArray">Array</a></td>
            </tr>
        </table></p>

      </td>
	</tr>

	<tr>
	  <td><p>Class Bit Fields</p></td>
	  <td>
        <p>The information in these bit fields is specific to each datatype
          class and is described below.  All bits not defined for a
          datatype class are set to zero.
        </p>
      </td>
	</tr>

	<tr>
	  <td><p>Size</p></td>
	  <td>
        <p>The size of a datatype element in bytes.
        </p>
      </td>
	</tr>

	<tr>
	  <td><p>Properties</p></td>
	  <td>
        <p>This variable-sized sequence of bytes encodes information
          specific to each datatype class and is described for each class
          below.  If there is no property information specified for a
          datatype class, the size of this field is zero bytes.
        </p>
      </td>
	</tr>

  </table>
</div>


<br />
<br />
<a name="ClassFixedPoint"></a>
  <p>Class specific information for the Fixed-point Numbers class
    (Class 0):</p>

  <div align="center">
    <table class="desc">
      <caption>
        Bits: Fixed-point Bit Field Description
      </caption>

	  <tr>
	    <th width="10%">Bits</th>
	    <th>Meaning</th>
	  </tr>

	  <tr>
	    <td><p>0</p></td>
	    <td><p><b>Byte Order.</b> If zero, byte order is little-endian;
	        otherwise, byte order is big endian.</p></td>
	  </tr>

	  <tr>
	    <td><p>1, 2</p></td>
	    <td><p><b>Padding type.</b>  Bit 1 is the lo_pad bit and bit 2
	        is the hi_pad bit.  If a datum has unused bits at either
	        end, then the lo_pad or hi_pad bit is copied to those
	        locations.</p></td>
	  </tr>

	  <tr>
	    <td><p>3</p></td>
	    <td><p><b>Signed.</b> If this bit is set then the fixed-point
	        number is in 2&rsquo;s complement form.</p></td>
	  </tr>

	  <tr>
	    <td><p>4-23</p></td>
	    <td><p>Reserved (zero).</p></td>
	  </tr>
    </table>
  </div>

  <br />
  <div align="center">
    <table class="format">
      <caption>
        Layout: Fixed-point Property Description
      </caption>

	  <tr>
	    <th width="25%">Byte</th>
	    <th width="25%">Byte</th>
	    <th width="25%">Byte</th>
	    <th width="25%">Byte</th>
	  </tr>

	  <tr>
	    <td colspan="2">Bit Offset</td>
	    <td colspan="2">Bit Precision</td>
	  </tr>
    </table>
  </div>

  <br />
  <div align="center">
    <table class="desc">
      <caption>
        Fields: Fixed-point Property Description
      </caption>
	  <tr>
        <th width="30%">Field Name</th>
        <th>Description</th>
	  </tr>

	  <tr>
	    <td><p>Bit Offset</p></td>
	    <td>
          <p>The bit offset of the first significant bit of the fixed-point
            value within the datatype.  The bit offset specifies the number
            of bits &ldquo;to the right of&rdquo; the value (which are set to the
            lo_pad bit value).
          </p>
        </td>
	  </tr>

	  <tr>
	    <td><p>Bit Precision</p></td>
	    <td>
          <p>The number of bits of precision of the fixed-point value
            within the datatype.  This value, combined with the datatype
            element&rsquo;s size and the Bit Offset field specifies the number
            of bits &ldquo;to the left of&rdquo; the value (which are set to the
            hi_pad bit value).
          </p>
        </td>
	  </tr>

    </table>
  </div>


  <br />
  <br />
  <a name="ClassFloatingPoint"></a>
    <p>Class specific information for the Floating-point Numbers class
      (Class 1):</p>

    <div align="center">
      <table class="desc">
        <caption>
          Bits: Floating-point Bit Field Description
        </caption>

	    <tr>
	      <th width="10%">Bits</th>
	      <th>Meaning</th>
	    </tr>

	    <tr>
	      <td><p>0, 6</p></td>
	      <td><p><b>Byte Order.</b> These two non-contiguous bits specify the
              &ldquo;endianness&rdquo; of the bytes in the datatype element.
              <table class="list">
                <tr>
                  <th width="10%" align="center">Bit 6</th>
                  <th width="10%" align="center">Bit 0</th>
                  <th width="80%" align="left">Description</th>
                </tr>

                <tr>
                  <td align="center"><code>0</code></td>
                  <td align="center"><code>0</code></td>
                  <td>Byte order is little-endian
                  </td>
                </tr>
                <tr>
                  <td align="center"><code>0</code></td>
                  <td align="center"><code>1</code></td>
                  <td>Byte order is big-endian
                  </td>
                </tr>
                <tr>
                  <td align="center"><code>1</code></td>
                  <td align="center"><code>0</code></td>
                  <td>Reserved
                  </td>
                </tr>
                <tr>
                  <td align="center"><code>1</code></td>
                  <td align="center"><code>1</code></td>
                  <td>Byte order is VAX-endian
                  </td>
                </tr>
            </table></p>
          </td>
	    </tr>

	    <tr>
	      <td><p>1, 2, 3</p></td>
	      <td><p><b>Padding type.</b>  Bit 1 is the low bits pad type, bit 2
	          is the high bits pad type, and bit 3 is the internal bits
	          pad type.  If a datum has unused bits at either end or between
	          the sign bit, exponent, or mantissa, then the value of bit
	          1, 2, or 3 is copied to those locations.</p></td>
	    </tr>

	    <tr>
	      <td><p>4-5</p></td>
	      <td><p><b>Mantissa Normalization.</b> This 2-bit bit field specifies
              how the most significant bit of the mantissa is managed.
              <table class="list">
                <tr>
                  <th width="20%" align="center">Value</th>
                  <th width="80%" align="left">Description</th>
                </tr>

                <tr>
                  <td align="center"><code>0</code></td>
                  <td>No normalization
                  </td>
                </tr>
                <tr>
                  <td align="center"><code>1</code></td>
                  <td>The most significant bit of the mantissa is always set
                    (except for 0.0).
                  </td>
                </tr>
                <tr>
                  <td align="center"><code>2</code></td>
                  <td>The most significant bit of the mantissa is not stored,
                    but is implied to be set.
                  </td>
                </tr>
                <tr>
                  <td align="center"><code>3</code></td>
                  <td>Reserved.
                  </td>
                </tr>
            </table></p>
          </td>
	    </tr>

	    <tr>
	      <td><p>7</p></td>
	      <td><p>Reserved (zero).</p></td>
	    </tr>

	    <tr>
	      <td><p>8-15</p></td>
	      <td><p><b>Sign Location.</b> This is the bit position of the sign
	          bit.  Bits are numbered with the least significant bit zero.</p></td>
	    </tr>

	    <tr>
	      <td><p>16-23</p></td>
	      <td><p>Reserved (zero).</p></td>
	    </tr>

      </table>
    </div>

    <br />
    <div align="center">
      <table class="format">
        <caption>
          Layout: Floating-point Property Description
        </caption>

	    <tr>
	      <th width="25%">Byte</th>
	      <th width="25%">Byte</th>
	      <th width="25%">Byte</th>
	      <th width="25%">Byte</th>
	    </tr>

	    <tr>
	      <td colspan="2">Bit Offset</td>
	      <td colspan="2">Bit Precision</td>
	    </tr>

	    <tr>
	      <td>Exponent Location</td>
	      <td>Exponent Size</td>
	      <td>Mantissa Location</td>
	      <td>Mantissa Size</td>
	    </tr>

	    <tr>
	      <td colspan="4">Exponent Bias</td>
	    </tr>
      </table>
    </div>

    <br />
    <div align="center">
      <table class="desc">
        <caption>
          Fields: Floating-point Property Description
        </caption>
	    <tr>
          <th width="30%">Field Name</th>
          <th>Description</th>
	    </tr>

	    <tr>
	      <td><p>Bit Offset</p></td>
	      <td>
            <p>The bit offset of the first significant bit of the floating-point
              value within the datatype.  The bit offset specifies the number
              of bits &ldquo;to the right of&rdquo; the value.
            </p>
          </td>
	    </tr>

	    <tr>
	      <td><p>Bit Precision</p></td>
	      <td>
            <p>The number of bits of precision of the floating-point value
              within the datatype.
            </p>
          </td>
	    </tr>

	    <tr>
	      <td><p>Exponent Location</p></td>
	      <td>
            <p>The bit position of the exponent field.  Bits are numbered with
              the least significant bit number zero.
            </p>
          </td>
	    </tr>

	    <tr>
	      <td><p>Exponent Size</p></td>
	      <td>
            <p>The size of the exponent field in bits.
            </p>
          </td>
	    </tr>

	    <tr>
	      <td><p>Mantissa Location</p></td>
	      <td>
            <p>The bit position of the mantissa field.  Bits are numbered with
              the least significant bit number zero.
            </p>
          </td>
	    </tr>

	    <tr>
	      <td><p>Mantissa Size</p></td>
	      <td>
            <p>The size of the mantissa field in bits.
            </p>
          </td>
	    </tr>

	    <tr>
	      <td><p>Exponent Bias</p></td>
	      <td>
            <p>The bias of the exponent field.
            </p>
          </td>
	    </tr>

      </table>
    </div>


    <br />
    <br />
    <a name="ClassTime"></a>
      <p>Class specific information for the Time class (Class 2):</p>


      <div align="center">
        <table class="desc">
          <caption>
            Bits: Time Bit Field Description
          </caption>

	      <tr>
	        <th width="10%">Bits</th>
	        <th>Meaning</th>
	      </tr>

	      <tr>
	        <td><p>0</p></td>
	        <td><p><b>Byte Order.</b> If zero, byte order is little-endian;
	            otherwise, byte order is big endian.</p></td>
	      </tr>

	      <tr>
	        <td><p>1-23</p></td>
	        <td><p>Reserved (zero).</p></td>
	      </tr>
        </table>
      </div>

      <br />
      <div align="center">
        <table class="format">
          <caption>
            Layout: Time Property Description
          </caption>

	      <tr>
	        <th width="25%">Byte</th>
	        <th width="25%">Byte</th>
	      </tr>

	      <tr>
	        <td colspan="2">Bit Precision</td>
	      </tr>
        </table>
      </div>

      <br />
      <div align="center">
        <table class="desc">
          <caption>
            Fields: Time Property Description
          </caption>
	      <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
	      </tr>

	      <tr>
	        <td><p>Bit Precision</p></td>
	        <td>
              <p>The number of bits of precision of the time value.
              </p>
            </td>
	      </tr>

        </table>
      </div>


      <br />
      <a name="ClassString"></a>
        <p>Class specific information for the Strings class (Class 3):</p>


        <div align="center">
          <table class="desc">
            <caption>
              Bits: String Bit Field Description
            </caption>

	        <tr>
	          <th width="10%">Bits</th>
	          <th>Meaning</th>
	        </tr>

	        <tr>
	          <td><p>0-3</p></td>
	          <td><p><b>Padding type.</b>  This four-bit value determines the
	              type of padding to use for the string.  The values are:

                  <table class="list">
                    <tr>
                      <th width="20%" align="center">Value</th>
                      <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                      <td align="center"><code>0</code></td>
                      <td>Null Terminate: A zero byte marks the end of the
                        string and is guaranteed to be present after
                        converting a long string to a short string.  When
                        converting a short string to a long string the value is
                        padded with additional null characters as necessary.
                      </td>
                    </tr>

                    <tr>
                      <td align="center"><code>1</code></td>
                      <td>Null Pad: Null characters are added to the end of
                        the value during conversions from short values to long
                        values but conversion in the opposite direction simply
                        truncates the value.
                      </td>
                    </tr>

                    <tr>
                      <td align="center"><code>2</code></td>
                      <td>Space Pad: Space characters are added to the end of
                        the value during conversions from short values to long
                        values but conversion in the opposite direction simply
                        truncates the value.  This is the Fortran
                        representation of the string.
                      </td>
                    </tr>

                    <tr>
                      <td align="center"><code>3-15</code></td>
                      <td>Reserved
                      </td>
                    </tr>
                </table></p>
              </td>
	        </tr>

	        <tr>
	          <td><p>4-7</p></td>
	          <td><p><b>Character Set.</b>  The character set used to
	              encode the string.
                  <table class="list">
                    <tr>
                      <th width="20%" align="center">Value</th>
                      <th width="80%" align="left">Description</th>
                    </tr>

                    <tr>
                      <td align="center"><code>0</code></td>
                      <td>ASCII character set encoding
                      </td>
                    </tr>

                    <tr>
                      <td align="center"><code>1</code></td>
                      <td>UTF-8 character set encoding
                      </td>
                    </tr>

                    <tr>
                      <td align="center"><code>2-15</code></td>
                      <td>Reserved
                      </td>
                    </tr>
                </table></p>
              </td>
	        </tr>

	        <tr>
	          <td><p>8-23</p></td>
	          <td><p>Reserved (zero).</p></td>
	        </tr>
          </table>
        </div>

        <p>There are no properties defined for the string class.
        </p>

        <br />
        <br />
        <a name="ClassBitField"></a>
          <p>Class specific information for the Bit Fields class (Class 4):</p>

          <div align="center">
            <table class="desc">
              <caption>
                Bits: Bitfield Bit Field Description
              </caption>

	          <tr>
	            <th width="10%">Bits</th>
	            <th>Meaning</th>
	          </tr>

	          <tr>
	            <td><p>0</p></td>
	            <td><p><b>Byte Order.</b> If zero, byte order is little-endian;
	                otherwise, byte order is big endian.</p></td>
	          </tr>

	          <tr>
	            <td><p>1, 2</p></td>
	            <td><p><b>Padding type.</b>  Bit 1 is the lo_pad type and bit 2
	                is the hi_pad type.  If a datum has unused bits at either
	                end, then the lo_pad or hi_pad bit is copied to those
	                locations.</p></td>
	          </tr>

	          <tr>
	            <td><p>3-23</p></td>
	            <td><p>Reserved (zero).</p></td>
	          </tr>
            </table>
          </div>

          <br />
          <div align="center">
            <table class="format">
              <caption>
                Layout: Bit Field Property Description
              </caption>

	          <tr>
	            <th width="25%">Byte</th>
	            <th width="25%">Byte</th>
	            <th width="25%">Byte</th>
	            <th width="25%">Byte</th>
	          </tr>

	          <tr>
	            <td colspan="2">Bit Offset</td>
	            <td colspan="2">Bit Precision</td>
	          </tr>
            </table>
          </div>

          <br />
          <div align="center">
            <table class="desc">
              <caption>
                Fields: Bit Field Property Description
              </caption>
	          <tr>
                <th width="30%">Field Name</th>
                <th>Description</th>
	          </tr>

	          <tr>
	            <td><p>Bit Offset</p></td>
	            <td>
                  <p>The bit offset of the first significant bit of the bit field
                    within the datatype.  The bit offset specifies the number
                    of bits &ldquo;to the right of&rdquo; the value.
                  </p>
                </td>
	          </tr>

	          <tr>
	            <td><p>Bit Precision</p></td>
	            <td>
                  <p>The number of bits of precision of the bit field
                    within the datatype.
                  </p>
                </td>
	          </tr>
            </table>
          </div>


          <br />
          <br />
          <a name="ClassOpaque"></a>
            <p>Class specific information for the Opaque class (Class 5):</p>

            <div align="center">
              <table class="desc">
                <caption>
                  Bits: Opaque Bit Field Description
                </caption>

	            <tr>
	              <th width="10%">Bits</th>
	              <th>Meaning</th>
	            </tr>

	            <tr>
	              <td><p>0-7</p></td>
	              <td><p>Length of ASCII tag in bytes.</p></td>
	            </tr>

	            <tr>
	              <td><p>8-23</p></td>
	              <td><p>Reserved (zero).</p></td>
	            </tr>
              </table>
            </div>

            <br />
            <div align="center">
              <table class="format">
                <caption>
                  Layout: Opaque Property Description
                </caption>

	            <tr>
	              <th width="25%">Byte</th>
	              <th width="25%">Byte</th>
	              <th width="25%">Byte</th>
	              <th width="25%">Byte</th>
	            </tr>

	            <tr>
	              <td colspan="4"><br />ASCII Tag<br />
	                <br /></td>
	            </tr>
              </table>
            </div>

            <br />
            <div align="center">
              <table class="desc">
                <caption>
                  Fields: Opaque Property Description
                </caption>
	            <tr>
                  <th width="30%">Field Name</th>
                  <th>Description</th>
	            </tr>

	            <tr>
	              <td><p>ASCII Tag</p></td>
	              <td>
                    <p>This NUL-terminated string provides a description for the
                      opaque type.  It is NUL-padded to a multiple of 8 bytes.
                    </p>
                  </td>
	            </tr>
              </table>
            </div>


            <br />
            <br />
            <a name="ClassCompound"></a>
              <p>Class specific information for the Compound class (Class 6):</p>

              <div align="center">
                <table class="desc">
                  <caption>
                    Bits: Compound Bit Field Description
                  </caption>

	              <tr>
	                <th width="10%">Bits</th>
	                <th>Meaning</th>
	              </tr>

	              <tr>
	                <td><p>0-15</p></td>
	                <td><p><b>Number of Members.</b> This field contains the number
	                    of members defined for the compound datatype.  The member
	                    definitions are listed in the Properties field of the data
	                    type message.</p></td>
	              </tr>

	              <tr>
	                <td><p>16-23</p></td>
	                <td><p>Reserved (zero).</p></td>
	              </tr>
                </table>
              </div>


              <p>The Properties field of a compound datatype is a list of the
                member definitions of the compound datatype.  The member
                definitions appear one after another with no intervening bytes.
                The member types are described with a (recursively) encoded datatype
                message.</p>

              <p>Note that the property descriptions are different for different
                versions of the datatype version.  Additionally note that the version
                0 datatype encoding is deprecated and has been replaced with later
                encodings in versions of the HDF5 Library from the 1.4 release
                onward.</p>


              <div align="center">
                <table class="format">
                  <caption>
                    Layout: Compound Properties Description for Datatype Version 1
                  </caption>

	              <tr>
	                <th width="25%">Byte</th>
	                <th width="25%">Byte</th>
	                <th width="25%">Byte</th>
	                <th width="25%">Byte</th>
	              </tr>

	              <tr>
	                <td colspan="4"><br />Name<br /><br /></td>
	              </tr>

	              <tr>
	                <td colspan="4">Byte Offset of Member</td>
	              </tr>

	              <tr>
	                <td>Dimensionality</td>
	                <td colspan="3">Reserved (zero)</td>
	              </tr>

	              <tr>
	                <td colspan="4">Dimension Permutation</td>
	              </tr>

	              <tr>
	                <td colspan="4">Reserved (zero)</td>
	              </tr>

	              <tr>
	                <td colspan="4">Dimension #1 Size (required)</td>
	              </tr>

	              <tr>
	                <td colspan="4">Dimension #2 Size (required)</td>
	              </tr>

	              <tr>
	                <td colspan="4">Dimension #3 Size (required)</td>
	              </tr>

	              <tr>
	                <td colspan="4">Dimension #4 Size (required)</td>
	              </tr>

	              <tr>
	                <td colspan="4"><br />Member Type Message<br /><br /></td>
	              </tr>

                </table>
              </div>

              <br />
              <div align="center">
                <table class="desc">
                  <caption>
                    Fields: Compound Properties Description for Datatype Version 1
                  </caption>
	              <tr>
                    <th width="30%">Field Name</th>
                    <th>Description</th>
	              </tr>

	              <tr>
	                <td><p>Name</p></td>
	                <td>
                      <p>This NUL-terminated string provides a description for the
                        opaque type.  It is NUL-padded to a multiple of 8 bytes.
                      </p>
                    </td>
	              </tr>

	              <tr>
	                <td><p>Byte Offset of Member</p></td>
	                <td>
                      <p>This is the byte offset of the member within the datatype.
                      </p>
                    </td>
	              </tr>

	              <tr>
	                <td><p>Dimensionality</p></td>
	                <td>
                      <p>If set to zero, this field indicates a scalar member.  If set
                        to a value greater than zero, this field indicates that the
                        member is an array of values.  For array members, the size of
                        the array is indicated by the &lsquo;Size of Dimension n&rsquo; field in
                        this message.
                      </p>
                    </td>
	              </tr>

	              <tr>
	                <td><p>Dimension Permutation</p></td>
	                <td>
                      <p>This field was intended to allow an array field to have
                        its dimensions permuted, but this was never implemented.
                        This field should always be set to zero.
                      </p>
                    </td>
	              </tr>

	              <tr>
	                <td><p>Dimension #n Size</p></td>
	                <td>
                      <p>This field is the size of a dimension of the array field as
                        stored in the file.  The first dimension stored in the list of
                        dimensions is the slowest changing dimension and the last
                        dimension stored is the fastest changing dimension.
                      </p>
                    </td>
	              </tr>

	              <tr>
	                <td><p>Member Type Message</p></td>
	                <td>
                      <p>This field is a datatype message describing the datatype of
                        the member.
                      </p>
                    </td>
	              </tr>

                </table>
              </div>

              <br />
              <br />
              <br />
              <div align="center">
                <table class="format">
                  <caption>
                    Layout: Compound Properties Description for Datatype Version 2
                  </caption>

	              <tr>
	                <th width="25%">Byte</th>
	                <th width="25%">Byte</th>
	                <th width="25%">Byte</th>
	                <th width="25%">Byte</th>
	              </tr>

	              <tr>
	                <td colspan="4"><br />Name<br /><br /></td>
	              </tr>

	              <tr>
	                <td colspan="4">Byte Offset of Member</td>
	              </tr>

	              <tr>
	                <td colspan="4"><br />Member Type Message<br /><br /></td>
	              </tr>

                </table>
              </div>

              <br />
              <div align="center">
                <table class="desc">
                  <caption>
                    Fields: Compound Properties Description for Datatype Version 2
                  </caption>
	              <tr>
                    <th width="30%">Field Name</th>
                    <th>Description</th>
	              </tr>

	              <tr>
	                <td><p>Name</p></td>
	                <td>
                      <p>This NUL-terminated string provides a description for the
                        opaque type.  It is NUL-padded to a multiple of 8 bytes.
                      </p>
                    </td>
	              </tr>

	              <tr>
	                <td><p>Byte Offset of Member</p></td>
	                <td>
                      <p>This is the byte offset of the member within the datatype.
                      </p>
                    </td>
	              </tr>

	              <tr>
	                <td><p>Member Type Message</p></td>
	                <td>
                      <p>This field is a datatype message describing the datatype of
                        the member.
                      </p>
                    </td>
	              </tr>

                </table>
              </div>


              <br />
              <br />
              <br />
              <div align="center">
                <table class="format">
                  <caption>
                    Layout: Compound Properties Description for Datatype Version 3
                  </caption>

	              <tr>
	                <th width="25%">Byte</th>
	                <th width="25%">Byte</th>
	                <th width="25%">Byte</th>
	                <th width="25%">Byte</th>
	              </tr>

	              <tr>
	                <td colspan="4"><br />Name<br /><br /></td>
	              </tr>

	              <tr>
	                <td colspan="4">Byte Offset of Member <em>(variable size)</em></td>
	              </tr>

	              <tr>
	                <td colspan="4"><br />Member Type Message<br /><br /></td>
	              </tr>

                </table>
              </div>

              <br />
              <div align="center">
                <table class="desc">
                  <caption>
                    Fields: Compound Properties Description for Datatype Version 3
                  </caption>
	              <tr>
                    <th width="30%">Field Name</th>
                    <th>Description</th>
	              </tr>

	              <tr>
	                <td><p>Name</p></td>
	                <td><p>This NUL-terminated string provides a description for the
                        opaque type. It is <em>not</em> NUL-padded to a multiple of 8
                        bytes.</p></td>
	              </tr>

	              <tr>
                    <td><p>Byte Offset of Member</p></td>
                    <td><p>This is the byte offset of the member within the datatype.
                        The field size is the minimum number of bytes necessary,
                        based on the size of the datatype element. For example, a
                        datatype element size of less than 256 bytes uses a 1 byte
                        length, a datatype element size of 256-65535 bytes uses a
                        2 byte length, and so on.</p></td>
	              </tr>

	              <tr>
	                <td><p>Member Type Message</p></td>
	                <td><p>This field is a datatype message describing the datatype of
                        the member.</p></td>
	              </tr>

                </table>
              </div>


              <br />
              <br />
              <a name="ClassReference"></a>
                <p>Class specific information for the Reference class (Class 7):</p>

                <div align="center">
                  <table class="desc">
                    <caption>
                      Bits: Reference Bit Field Description for Datatype Version &lt; 4
                    </caption>

	                <tr>
	                  <th width="10%">Bits</th>
	                  <th>Meaning</th>
	                </tr>

	                <tr>
	                  <td><p>0-3</p></td>
	                  <td><p><b>Type.</b> This four-bit value contains the reference types which are supported for
                          backward compatibility.  The values defined are:

                          <table class="list">
                            <tr>
                              <th width="20%" align="center">Value</th>
                              <th width="80%" align="left">Description</th>
                            </tr>

                            <tr>
                              <td align="center"><code>0</code></td>
                              <td>Object Reference (H5R_OBJECT1): A reference to another object in this
                                HDF5 file.
                              </td>
                            </tr>

                            <tr>
                              <td align="center"><code>1</code></td>
                              <td>Dataset Region Reference (H5R_DATASET_REGION1): A reference to a region within
                                a dataset in this HDF5 file.
                              </td>
                            </tr>

                            <tr>
                              <td align="center"><code>2-15</code></td>
                              <td>Reserved
                              </td>
                            </tr>
                        </table></p>

                      </td>
	                </tr>

	                <tr>
	                  <td><p>4-23</p></td>
	                  <td><p>Reserved (zero).</p></td>
	                </tr>
                  </table>
                </div>

                <br />
                <div align="center">
                  <table class="desc">
                    <caption>
                      Bits: Reference Bit Field Description for Datatype Version 4
                    </caption>

	                <tr>
	                  <th width="10%">Bits</th>
	                  <th>Meaning</th>
	                </tr>

	                <tr>
	                  <td><p>0-3</p></td>
	                  <td><p><b>Type.</b> This four-bit value contains the revised reference types.
                          The values defined are:

                          <table class="list">
                            <tr>
                              <th width="20%" align="center">Value</th>
                              <th width="80%" align="left">Description</th>
                            </tr>

                            <tr>
                              <td align="center"><code>2</code></td>
                              <td>Object Reference (H5R_OBJECT2): A reference to another object
                                in this file or an external file.
                              </td>
                            </tr>

                            <tr>
                              <td align="center"><code>3</code></td>
                              <td>Dataset Region Reference (H5R_DATASET_REGION2): A reference to a region within
                                a dataset in this file or an external file.
                              </td>
                            </tr>

                            <tr>
                              <td align="center"><code>4</code></td>
                              <td>Attribute Reference (H5R_ATTR): A reference to an attribute attached to an
                                object in this file or an external file.
                              </td>
                            </tr>

                            <tr>
                              <td align="center"><code>5-15</code></td>
                              <td>Reserved
                              </td>
                            </tr>
                        </table></p>

                      </td>
	                </tr>

	                <tr>
	                  <td><p>4-7</p></td>
	                  <td><p><b>Version.</b> This four-bit value contains the version for encoding
                          the revised reference types.  The values defined are:
                          <table class="list">
                            <tr>
                              <th width="20%" align="center">Value</th>
                              <th width="80%" align="left">Description</th>
                            </tr>

                            <tr>
                              <td align="center"><code>0</code></td>
                              <td>Unused
                              </td>
                            </tr>

                            <tr>
                              <td align="center"><code>1</code></td>
                              <td>The version for encoding the revised reference types: Object Reference (2),
                                Dataset Region Reference (3) and Attribute Reference (4).
                              </td>
                            </tr>

                            <tr>
                              <td align="center"><code>2-15</code></td>
                              <td>Reserved
                              </td>
                            </tr>

                        </table></p>

                      </td>
	                </tr>

	                <tr>
	                  <td><p>8-23</p></td>
	                  <td><p>Reserved (zero).</p></td>
	                </tr>
                  </table>
                </div>

                <p>There are no properties defined for the reference class.
                </p>


                <br />
                <br />
                <a name="ClassEnum"></a>
                  <p>Class specific information for the Enumeration class (Class 8):</p>

                  <div align="center">
                    <table class="desc">
                      <caption>
                        Bits: Enumeration Bit Field Description
                      </caption>

	                  <tr>
	                    <th width="10%">Bits</th>
	                    <th>Meaning</th>
	                  </tr>

	                  <tr>
	                    <td><p>0-15</p></td>
	                    <td><p><b>Number of Members.</b> The number of name/value
	                        pairs defined for the enumeration type.</p></td>
	                  </tr>

	                  <tr>
	                    <td><p>16-23</p></td>
	                    <td><p>Reserved (zero).</p></td>
	                  </tr>
                    </table>
                  </div>

                  <br />
                  <br />
                  <div align="center">
                    <table class="format">
                      <caption>
                        Layout: Enumeration Property Description for Datatype Versions
                        1 and 2
                      </caption>

	                  <tr>
	                    <th width="25%">Byte</th>
	                    <th width="25%">Byte</th>
	                    <th width="25%">Byte</th>
	                    <th width="25%">Byte</th>
	                  </tr>

	                  <tr>
	                    <td colspan="4"><br />Base Type<br /><br /></td>
	                  </tr>

	                  <tr>
	                    <td colspan="4"><br />Names<br /><br /></td>
	                  </tr>

	                  <tr>
	                    <td colspan="4"><br />Values<br /><br /></td>
                      </tr>

                    </table>
                  </div>

                  <br />
                  <div align="center">
                    <table class="desc">
                      <caption>
                        Fields: Enumeration Property Description for Datatype Versions
                        1 and 2
                      </caption>
	                  <tr>
                        <th width="30%">Field Name</th>
                        <th>Description</th>
	                  </tr>

	                  <tr>
	                    <td><p>Base Type</p></td>
	                    <td>
                          <p>Each enumeration type is based on some parent type, usually an
                            integer. The information for that parent type is described
                            recursively by this field.
                          </p>
                        </td>
	                  </tr>

	                  <tr>
	                    <td><p>Names</p></td>
	                    <td>
                          <p>The name for each name/value pair. Each name is stored as a null
                            terminated ASCII string in a multiple of eight bytes. The names
                            are in no particular order.
                          </p>
                        </td>
	                  </tr>

	                  <tr>
	                    <td><p>Values</p></td>
	                    <td>
                          <p>The list of values in the same order as the names.  The values
                            are packed (no inter-value padding) and the size of each value
                            is determined by the parent type.
                          </p>
                        </td>
	                  </tr>

                    </table>
                  </div>

                  <br />
                  <br />
                  <br />
                  <div align="center">
                    <table class="format">
                      <caption>
                        Layout: Enumeration Property Description for Datatype Version 3
                      </caption>

	                  <tr>
	                    <th width="25%">Byte</th>
	                    <th width="25%">Byte</th>
	                    <th width="25%">Byte</th>
	                    <th width="25%">Byte</th>
	                  </tr>

	                  <tr>
	                    <td colspan="4"><br />Base Type<br /><br /></td>
	                  </tr>

	                  <tr>
	                    <td colspan="4"><br />Names<br /><br /></td>
	                  </tr>

	                  <tr>
	                    <td colspan="4"><br />Values<br /><br /></td>
                      </tr>

                    </table>
                  </div>

                  <br />
                  <div align="center">
                    <table class="desc">
                      <caption>
                        Fields: Enumeration Property Description for Datatype Version 3
                      </caption>
	                  <tr>
                        <th width="30%">Field Name</th>
                        <th>Description</th>
	                  </tr>

	                  <tr>
	                    <td><p>Base Type</p></td>
	                    <td>
                          <p>Each enumeration type is based on some parent type, usually an
                            integer. The information for that parent type is described
                            recursively by this field.
                          </p>
                        </td>
	                  </tr>

	                  <tr>
	                    <td><p>Names</p></td>
	                    <td>
                          <p>The name for each name/value pair. Each name is stored as a null
                            terminated ASCII string, <em>not</em> padded to a multiple of
                            eight bytes. The names are in no particular order.
                          </p>
                        </td>
	                  </tr>

	                  <tr>
	                    <td><p>Values</p></td>
	                    <td>
                          <p>The list of values in the same order as the names.  The values
                            are packed (no inter-value padding) and the size of each value
                            is determined by the parent type.
                          </p>
                        </td>
	                  </tr>

                    </table>
                  </div>



                  <br />
                  <a name="ClassVarLen"></a>
                    <p>Class specific information for the Variable-length class (Class 9):</p>

                    <div align="center">
                      <table class="desc">
                        <caption>
                          Bits: Variable-length Bit Field Description
                        </caption>

	                    <tr>
	                      <th width="10%">Bits</th>
	                      <th>Meaning</th>
	                    </tr>

	                    <tr>
	                      <td><p>0-3</p></td>
	                      <td><p><b>Type.</b> This four-bit value contains the type of
                              variable-length datatype described.  The values defined are:

                              <table class="list">
                                <tr>
                                  <th width="20%" align="center">Value</th>
                                  <th width="80%" align="left">Description</th>
                                </tr>

                                <tr>
                                  <td align="center"><code>0</code></td>
                                  <td>Sequence: A variable-length sequence of any datatype.
                                    Variable-length sequences do not have padding or
                                    character set information.
                                  </td>
                                </tr>

                                <tr>
                                  <td align="center"><code>1</code></td>
                                  <td>String: A variable-length sequence of characters.
                                    Variable-length strings have padding and character set
                                    information.
                                  </td>
                                </tr>

                                <tr>
                                  <td align="center"><code>2-15</code></td>
                                  <td>Reserved
                                  </td>
                                </tr>
                            </table></p>

                          </td>
	                    </tr>

	                    <tr>
	                      <td><p>4-7</p></td>
	                      <td><p><b>Padding type.</b> (variable-length string only)
                              This four-bit value determines the type of padding
                              used for variable-length strings.  The values are the same
                              as for the string padding type, as follows:
                              <table class="list">
                                <tr>
                                  <th width="20%" align="center">Value</th>
                                  <th width="80%" align="left">Description</th>
                                </tr>

                                <tr>
                                  <td align="center"><code>0</code></td>
                                  <td>Null terminate: A zero byte marks the end of a string
                                    and is guaranteed to be present after converting a long
                                    string to a short string.  When converting a short string
                                    to a long string, the value is padded with additional null
                                    characters as necessary.
                                  </td>
                                </tr>

                                <tr>
                                  <td align="center"><code>1</code></td>
                                  <td>Null pad: Null characters are added to the end of the
                                    value during conversion from a short string to a longer
                                    string.  Conversion from a long string to a shorter string
                                    simply truncates the value.
                                  </td>
                                </tr>

                                <tr>
                                  <td align="center"><code>2</code></td>
                                  <td>Space pad: Space characters are added to the end of the
                                    value during conversion from a short string to a longer
                                    string.  Conversion from a long string to a shorter string
                                    simply truncates the value.  This is the Fortran
                                    representation of the string.
                                  </td>
                                </tr>

                                <tr>
                                  <td align="center"><code>3-15</code></td>
                                  <td>Reserved
                                  </td>
                                </tr>
                            </table></p>

                            <p>This value is set to zero for variable-length sequences.</p>

                          </td>
	                    </tr>

	                    <tr>
	                      <td><p>8-11</p></td>
	                      <td><p><b>Character Set.</b> (variable-length string only)
                              This four-bit value specifies the character set
                              to be used for encoding the string:
                              <table class="list">
                                <tr>
                                  <th width="20%" align="center">Value</th>
                                  <th width="80%" align="left">Description</th>
                                </tr>

                                <tr>
                                  <td align="center"><code>0</code></td>
                                  <td>ASCII character set encoding
                                  </td>
                                </tr>

                                <tr>
                                  <td align="center"><code>1</code></td>
                                  <td>UTF-8 character set encoding
                                  </td>
                                </tr>

                                <tr>
                                  <td align="center"><code>2-15</code></td>
                                  <td>Reserved
                                  </td>
                                </tr>
                            </table></p>

                            <p>This value is set to zero for variable-length sequences.</p>

                          </td>
	                    </tr>

	                    <tr>
	                      <td><p>12-23</p></td>
	                      <td><p>Reserved (zero).</p></td>
	                    </tr>
                      </table>
                    </div>

                    <br />
                    <div align="center">
                      <table class="format">
                        <caption>
                          Layout: Variable-length Property Description
                        </caption>

                        <tr>
                          <th width="25%">Byte</th>
                          <th width="25%">Byte</th>
                          <th width="25%">Byte</th>
                          <th width="25%">Byte</th>
                        </tr>

                        <tr>
                          <td colspan="4"><br />Base Type<br /><br /></td>
                        </tr>

                      </table>
                    </div>

                    <br />
                    <div align="center">
                      <table class="desc">
                        <caption>
                          Fields: Variable-length Property Description
                        </caption>
	                    <tr>
                          <th width="10%">Field Name</th>
                          <th>Description</th>
	                    </tr>

	                    <tr>
	                      <td><p>Base Type</p></td>
	                      <td>
                            <p>Each variable-length type is based on some parent type.  The
                              information for that parent type is described recursively by
                              this field.
                            </p>
                          </td>
	                    </tr>

                      </table>
                    </div>


                    <br />
                    <br />
                    <a name="ClassArray"></a>
                      <p>Class specific information for the Array class (Class 10):</p>

                      <p>There are no bit fields defined for the array class.
                      </p>

                      <p>Note that the dimension information defined in the property for this
                        datatype class is independent of dataspace information for a dataset.
                        The dimension information here describes the dimensionality of the
                        information within a data element (or a component of an element, if the
                        array datatype is nested within another datatype) and the dataspace for a
                        dataset describes the size and locations of the elements in a dataset.
                      </p>


                      <div align="center">
                        <table class="format">
                          <caption>
                            Layout: Array Property Description for Datatype Version 2
                          </caption>

                          <tr>
                            <th width="25%">Byte</th>
                            <th width="25%">Byte</th>
                            <th width="25%">Byte</th>
                            <th width="25%">Byte</th>
                          </tr>

	                      <tr>
	                        <td>Dimensionality</td>
	                        <td colspan="3">Reserved (zero)</td>
	                      </tr>

	                      <tr>
	                        <td colspan="4">Dimension #1 Size</td>
	                      </tr>
	                      <tr>
	                        <td colspan="4">.<br />.<br />.<br /></td>
	                      </tr>
	                      <tr>
	                        <td colspan="4">Dimension #n Size</td>
	                      </tr>

	                      <tr>
	                        <td colspan="4">Permutation Index #1</td>
	                      </tr>
	                      <tr>
	                        <td colspan="4">.<br />.<br />.<br /></td>
	                      </tr>
	                      <tr>
	                        <td colspan="4">Permutation Index #n</td>
	                      </tr>

                          <tr>
                            <td colspan="4"><br />Base Type<br /><br /></td>
                          </tr>

                        </table>
                      </div>

                      <br />
                      <div align="center">
                        <table class="desc">
                          <caption>
                            Fields: Array Property Description for Datatype Version 2
                          </caption>
	                      <tr>
                            <th width="30%">Field Name</th>
                            <th>Description</th>
	                      </tr>

	                      <tr>
	                        <td><p>Dimensionality</p></td>
	                        <td>
                              <p>This value is the number of dimensions that the array has.
                              </p>
                            </td>
	                      </tr>

	                      <tr>
	                        <td><p>Dimension #n Size</p></td>
	                        <td>
                              <p>This value is the size of the dimension of the array
	                            as stored in the file.  The first dimension stored in
	                            the list of dimensions is the slowest changing dimension
	                            and the last dimension stored is the fastest changing
	                            dimension.
                              </p>
                            </td>
	                      </tr>

	                      <tr>
	                        <td><p>Permutation Index #n</p></td>
	                        <td>
                              <p>This value is the index permutation used to map
                                each dimension from the canonical representation to an
                                alternate axis for each dimension. Currently, dimension
                                permutations are not supported, and these indices should
                                be set to the index position minus one. In other words,
                                the first dimension should be set to 0, the second dimension
                                should be set to 1, and so on.
                              </p>
                            </td>
	                      </tr>

	                      <tr>
	                        <td><p>Base Type</p></td>
	                        <td>
                              <p>Each array type is based on some parent type.  The
                                information for that parent type is described recursively by
                                this field.
                              </p>
                            </td>
	                      </tr>

                        </table>
                      </div>

                      <br />
                      <br />
                      <br />
                      <div align="center">
                        <table class="format">
                          <caption>
                            Layout: Array Property Description for Datatype Version 3
                          </caption>

                          <tr>
                            <th width="25%">Byte</th>
                            <th width="25%">Byte</th>
                            <th width="25%">Byte</th>
                            <th width="25%">Byte</th>
                          </tr>

	                      <tr>
	                        <td>Dimensionality</td>
                            <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
	                      </tr>

	                      <tr>
	                        <td colspan="4">Dimension #1 Size</td>
	                      </tr>
	                      <tr>
	                        <td colspan="4">.<br />.<br />.<br /></td>
	                      </tr>
	                      <tr>
	                        <td colspan="4">Dimension #n Size</td>
	                      </tr>

                          <tr>
                            <td colspan="4"><br />Base Type<br /><br /></td>
                          </tr>

                        </table>
                      </div>

                      <br />
                      <div align="center">
                        <table class="desc">
                          <caption>
                            Fields: Array Property Description for Datatype Version 3
                          </caption>
	                      <tr>
                            <th width="30%">Field Name</th>
                            <th>Description</th>
	                      </tr>

	                      <tr>
	                        <td><p>Dimensionality</p></td>
	                        <td>
                              <p>This value is the number of dimensions that the array has.
                              </p>
                            </td>
	                      </tr>

	                      <tr>
	                        <td><p>Dimension #n Size</p></td>
	                        <td>
                              <p>This value is the size of the dimension of the array
	                            as stored in the file.  The first dimension stored in
	                            the list of dimensions is the slowest changing dimension
	                            and the last dimension stored is the fastest changing
	                            dimension.
                              </p>
                            </td>
	                      </tr>

	                      <tr>
	                        <td><p>Base Type</p></td>
	                        <td>
                              <p>Each array type is based on some parent type.  The
                                information for that parent type is described recursively by
                                this field.
                              </p>
                            </td>
	                      </tr>

                        </table>
                      </div>



                      <h4><a name="OldFillValueMessage">IV.A.2.e. The Data Storage -
                          Fill Value (Old) Message</a></h4>

                      <!-- start msgdesc table -->
                      <center>
                        <table class="msgdesc">
                          <tr><td colspan="2"><b>Header Message Name:</b> Fill Value
                              (old)</td></tr>
                          <tr><td colspan="2"><b>Header Message Type:</b> 0x0004</td></tr>
                          <tr><td colspan="2"><b>Length:</b> Varies</td></tr>
                          <tr><td colspan="2"><b>Status:</b> Optional; may not be
                              repeated.</td></tr>
                          <tr><td><b>Description:</b></td>
                            <td><p>The fill value message stores a single data value which
                                is returned to the application when an uninitialized data element
                                is read from a dataset. The fill value is interpreted with the
                                same datatype as the dataset. If no fill value message is present
                                then a fill value of all zero bytes is assumed.</p>
                              <p>This fill value message is deprecated in favor of the
                                &ldquo;new&rdquo; fill value message (Message Type 0x0005) and
                                is only written to the file for forward compatibility with
                                versions of the HDF5 Library before the 1.6.0 version.
                                Additionally, it only appears for datasets with a user-defined
                                fill value (as opposed to the library default fill value or an
                                explicitly set &ldquo;undefined&rdquo; fill value).</p>
                          </td></tr>
                          <tr><td colspan="2"><b>Format of Data:</b> See the tables
                              below.</td></tr>
                      </table></center>
                      <!-- end msgdesc table -->

                      <div align="center">
                        <table class="format">
                          <caption>
                            Layout: Fill Value Message (Old)
                          </caption>

	                      <tr>
	                        <th width="25%">byte</th>
	                        <th width="25%">byte</th>
	                        <th width="25%">byte</th>
	                        <th width="25%">byte</th>
	                      </tr>

	                      <tr>
	                        <td colspan="4">Size</td>
	                      </tr>

	                      <tr>
	                        <td colspan="4"><br />Fill Value <em>(optional, variable size)</em><br /><br /></td>
	                      </tr>
                        </table>
                      </div>

                      <br />
                      <div align="center">
                        <table class="desc">
                          <caption>
                            Fields: Fill Value Message (Old)
                          </caption>
	                      <tr>
                            <th width="30%">Field Name</th>
                            <th>Description</th>
	                      </tr>

	                      <tr>
	                        <td><p>Size</p></td>
	                        <td>
                              <p>This is the size of the Fill Value field in bytes.
                              </p>
                            </td>
	                      </tr>

	                      <tr>
	                        <td><p>Fill Value</p></td>
	                        <td>
                              <p>The fill value.  The bytes of the fill value are interpreted
                                using the same datatype as for the dataset.
                              </p>
                            </td>
	                      </tr>
                        </table>
                      </div>


                      <h4><a name="FillValueMessage">IV.A.2.f. The Data Storage -
                          Fill Value Message</a></h4>

                      <!-- start msgdesc table -->
                      <center>
                        <table class="msgdesc">
                          <tr><td colspan="2"><b>Header Message Name:</b> Fill
                              Value</td></tr>
                          <tr><td colspan="2"><b>Header Message Type:</b> 0x0005</td></tr>
                          <tr><td colspan="2"><b>Length:</b> Varies</td></tr>
                          <tr><td colspan="2"><b>Status:</b> Required for dataset objects;
                              may not be repeated.</td></tr>
                          <tr><td><b>Description:</b></td>
                            <td>The fill value message stores a single data value which is
                              returned to the application when an uninitialized data element
                              is read from a dataset. The fill value is interpreted with the
                              same datatype as the dataset.</td></tr>
                          <tr><td colspan="2"><b>Format of Data:</b> See the tables
                              below.</td></tr>
                      </table></center>
                      <!-- end msgdesc table -->

                      <div align="center">
                        <table class="format">
                          <caption>
                            Layout: Fill Value Message - Versions 1 and 2
                          </caption>

	                      <tr>
	                        <th width="25%">byte</th>
	                        <th width="25%">byte</th>
	                        <th width="25%">byte</th>
	                        <th width="25%">byte</th>
	                      </tr>

	                      <tr>
	                        <td>Version</td>
	                        <td>Space Allocation Time</td>
	                        <td>Fill Value Write Time</td>
	                        <td>Fill Value Defined</td>
	                      </tr>

	                      <tr>
	                        <td colspan="4">Size <em>(optional)</em></td>
	                      </tr>

	                      <tr>
	                        <td colspan="4"><br />Fill Value <em>(optional, variable size)</em><br /><br /></td>
	                      </tr>
                        </table>
                      </div>

                      <br />
                      <div align="center">
                        <table class="desc">
                          <caption>
                            Fields: Fill Value Message - Versions 1 and 2
                          </caption>
	                      <tr>
                            <th width="30%">Field Name</th>
                            <th>Description</th>
	                      </tr>

	                      <tr>
	                        <td><p>Version</p></td>
	                        <td>
                              <p>The version number information is used for changes in the
                                format of the fill value message and is described here:
                                <table class="list">
                                  <tr>
                                    <th width="20%" align="center">Version</th>
                                    <th width="80%" align="left">Description</th>
                                  </tr>

                                  <tr>
                                    <td align="center"><code>0</code></td>
                                    <td>Never used
                                    </td>
                                  </tr>
                                  <tr>
                                    <td align="center"><code>1</code></td>
                                    <td>Initial version of this message.
                                    </td>
                                  </tr>
                                  <tr>
                                    <td align="center"><code>2</code></td>
                                    <td>In this version, the Size and Fill Value fields are
                                      only present if the Fill Value Defined field is set
                                      to 1.
                                    </td>
                                  </tr>
                                  <tr>
                                    <td align="center"><code>3</code></td>
                                    <td>This version packs the other fields in the message
                                      more efficiently than version 2.
                                    </td>
                                  </tr>
                              </table></p>

                            </td>
	                      </tr>

	                      <tr>
	                        <td><p>Space Allocation Time</p></td>
	                        <td>
                              <p>When the storage space for the dataset&rsquo;s raw data will be
                                allocated.  The allowed values are:
                                <table class="list">
                                  <tr>
                                    <th width="20%" align="center">Value</th>
                                    <th width="80%" align="left">Description</th>
                                  </tr>

                                  <tr>
                                    <td align="center"><code>0</code></td>
                                    <td>Not used.
                                    </td>
                                  </tr>
                                  <tr>
                                    <td align="center"><code>1</code></td>
                                    <td>Early allocation.  Storage space for the entire dataset
                                      should be allocated in the file when the dataset is
                                      created.
                                    </td>
                                  </tr>
                                  <tr>
                                    <td align="center"><code>2</code></td>
                                    <td>Late allocation.  Storage space for the entire dataset
                                      should not be allocated until the dataset is written
                                      to.
                                    </td>
                                  </tr>
                                  <tr>
                                    <td align="center"><code>3</code></td>
                                    <td>Incremental allocation.  Storage space for the
                                      dataset should not be allocated until the portion
                                      of the dataset is written to.  This is currently
                                      used in conjunction with chunked data storage for
                                      datasets.
                                    </td>
                                  </tr>
                              </table></p>

                            </td>
	                      </tr>

	                      <tr>
	                        <td><p>Fill Value Write Time</p></td>
	                        <td>
                              <p>At the time that storage space for the dataset&rsquo;s raw data is
                                allocated, this value indicates whether the fill value should
                                be written to the raw data storage elements.  The allowed values
                                are:
                                <table class="list">
                                  <tr>
                                    <th width="20%" align="center">Value</th>
                                    <th width="80%" align="left">Description</th>
                                  </tr>

                                  <tr>
                                    <td align="center"><code>0</code></td>
                                    <td>On allocation.  The fill value is always written to
                                      the raw data storage when the storage space is allocated.
                                    </td>
                                  </tr>
                                  <tr>
                                    <td align="center"><code>1</code></td>
                                    <td>Never.  The fill value should never be written to
                                      the raw data storage.
                                    </td>
                                  </tr>
                                  <tr>
                                    <td align="center"><code>2</code></td>
                                    <td>Fill value written if set by user.  The fill value
                                      will be written to the raw data storage when the storage
                                      space is allocated only if the user explicitly set
                                      the fill value.  If the fill value is the library
                                      default or is undefined, it will not be written to
                                      the raw data storage.
                                    </td>
                                  </tr>
                              </table></p>

                            </td>
	                      </tr>

	                      <tr>
	                        <td><p>Fill Value Defined</p></td>
	                        <td>
                              <p>This value indicates if a fill value is defined for this
                                dataset.  If this value is 0, the fill value is undefined.
                                If this value is 1, a fill value is defined for this dataset.
                                For version 2 or later of the fill value message, this value
                                controls the presence of the Size and Fill Value fields.
                              </p>
                            </td>
	                      </tr>

	                      <tr>
	                        <td><p>Size</p></td>
	                        <td>
                              <p>This is the size of the Fill Value field in bytes.  This field
                                is not present if the Version field is greater than 1,
                                and the Fill Value Defined field is set to 0.
                              </p>
                            </td>
	                      </tr>

	                      <tr>
	                        <td><p>Fill Value</p></td>
	                        <td>
                              <p>The fill value.  The bytes of the fill value are interpreted
                                using the same datatype as for the dataset.  This field is
                                not present if the Version field is greater than 1,
                                and the Fill Value Defined field is set to 0.
                              </p>
                            </td>
	                      </tr>
                        </table>
                      </div>

                      <br />
                      <br />
                      <br />
                      <div align="center">
                        <table class="format">
                          <caption>
                            Layout: Fill Value Message - Version 3
                          </caption>

	                      <tr>
	                        <th width="25%">byte</th>
	                        <th width="25%">byte</th>
	                        <th width="25%">byte</th>
	                        <th width="25%">byte</th>
	                      </tr>

	                      <tr>
	                        <td>Version</td>
	                        <td>Flags</td>
                            <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
	                      </tr>

	                      <tr>
	                        <td colspan="4">Size <em>(optional)</em></td>
	                      </tr>

	                      <tr>
	                        <td colspan="4"><br />Fill Value <em>(optional, variable size)</em><br /><br /></td>
	                      </tr>
                        </table>
                      </div>

                      <br />
                      <div align="center">
                        <table class="desc">
                          <caption>
                            Fields: Fill Value Message - Version 3
                          </caption>
	                      <tr>
                            <th width="30%">Field Name</th>
                            <th>Description</th>
	                      </tr>

	                      <tr>
	                        <td><p>Version</p></td>
	                        <td>
                              <p>The version number information is used for changes in the
                                format of the fill value message and is described here:
                                <table class="list">
                                  <tr>
                                    <th width="20%" align="center">Version</th>
                                    <th width="80%" align="left">Description</th>
                                  </tr>

                                  <tr>
                                    <td align="center"><code>0</code></td>
                                    <td>Never used
                                    </td>
                                  </tr>
                                  <tr>
                                    <td align="center"><code>1</code></td>
                                    <td>Initial version of this message.
                                    </td>
                                  </tr>
                                  <tr>
                                    <td align="center"><code>2</code></td>
                                    <td>In this version, the Size and Fill Value fields are
                                      only present if the Fill Value Defined field is set
                                      to 1.
                                    </td>
                                  </tr>
                                  <tr>
                                    <td align="center"><code>3</code></td>
                                    <td>This version packs the other fields in the message
                                      more efficiently than version 2.
                                    </td>
                                  </tr>
                              </table></p>

                            </td>
	                      </tr>

	                      <tr>
	                        <td><p>Flags</p></td>
	                        <td>
                              <p>When the storage space for the dataset&rsquo;s raw data will be
                                allocated.  The allowed values are:
                                <table class="list">
                                  <tr>
                                    <th width="20%" align="center">Bits</th>
                                    <th width="80%" align="left">Description</th>
                                  </tr>

                                  <tr>
                                    <td align="center"><code>0-1</code></td>
                                    <td>Space Allocation Time, with the same
                                      values as versions 1 and 2 of the message.
                                    </td>
                                  </tr>
                                  <tr>
                                    <td align="center"><code>2-3</code></td>
                                    <td>Fill Value Write Time, with the same
                                      values as versions 1 and 2 of the message.
                                    </td>
                                  </tr>
                                  <tr>
                                    <td align="center"><code>4</code></td>
                                    <td>Fill Value Undefined, indicating that the fill
                                      value has been marked as &ldquo;undefined&rdquo; for this dataset.
                                      Bits 4 and 5 cannot both be set.
                                    </td>
                                  </tr>
                                  <tr>
                                    <td align="center"><code>5</code></td>
                                    <td>Fill Value Defined, with the same values as
                                      versions 1 and 2 of the message.
                                      Bits 4 and 5 cannot both be set.
                                    </td>
                                  </tr>
                                  <tr>
                                    <td align="center"><code>6-7</code></td>
                                    <td>Reserved (zero).
                                    </td>
                                  </tr>
                              </table></p>

                            </td>
	                      </tr>

	                      <tr>
	                        <td><p>Size</p></td>
	                        <td>
                              <p>This is the size of the Fill Value field in bytes.  This field
                                is not present if the Version field is greater than 1,
                                and the Fill Value Defined flag is set to 0.
                              </p>
                            </td>
	                      </tr>

	                      <tr>
	                        <td><p>Fill Value</p></td>
	                        <td>
                              <p>The fill value.  The bytes of the fill value are interpreted
                                using the same datatype as for the dataset.  This field is
                                not present if the Version field is greater than 1,
                                and the Fill Value Defined flag is set to 0.
                              </p>
                            </td>
	                      </tr>
                        </table>
                      </div>


                      <h4><a name="LinkMessage">IV.A.2.g. The Link Message</a></h4>

                      <!-- start msgdesc table -->
                      <center>
                        <table class="msgdesc">
                          <tr><td colspan="2"><b>Header Message Name:</b> Link</td></tr>
                          <tr><td colspan="2"><b>Header Message Type:</b> 0x0006</td></tr>
                          <tr><td colspan="2"><b>Length:</b> Varies </td></tr>
                          <tr><td colspan="2"><b>Status:</b> Optional; may be
                              repeated. </td></tr>
                          <tr><td><b>Description:</b></td>
                            <td><p>This message encodes the information for a link in a
                                group&rsquo;s object header, when the group is storing its links
                                &ldquo;compactly&rdquo;, or in the group&rsquo;s fractal heap,
                                when the group is storing its links &ldquo;densely&rdquo;.</p>
                              <p>A group is storing its links compactly when the fractal heap
                                address in the <em><a href="#LinkInfoMessage">Link Info
                                    Message</a></em> is set to the &ldquo;undefined address&rdquo;
                                value.</p></td></tr>
                          <tr><td colspan="2"><b>Format of Data:</b> See the tables
                              below.</td></tr>
                      </table></center>
                      <!-- end msgdesc table -->

                      <div align="center">
                        <table class="format">
                          <caption>
                            Layout: Link Message
                          </caption>

	                      <tr>
	                        <th width="25%">byte</th>
	                        <th width="25%">byte</th>
	                        <th width="25%">byte</th>
	                        <th width="25%">byte</th>
	                      </tr>

	                      <tr>
	                        <td>Version</td>
	                        <td>Flags</td>
	                        <td>Link type <em>(optional)</em></td>
                            <td bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
	                      </tr>
	                      <tr>
	                        <td colspan="4"><br />Creation Order <em>(8 bytes, optional)</em><br /><br /></td>
	                      </tr>
	                      <tr>
	                        <td>Link Name Character Set <em>(optional)</em></td>
	                        <td>Length of Link Name (variable size)</td>
                            <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
	                      </tr>
	                      <tr>
	                        <td colspan="4">Link Name (variable size)</td>
	                      </tr>
	                      <tr>
	                        <td colspan="4"><br />Link Information (variable size)<br /><br /></td>
	                      </tr>
                        </table>
                      </div>

                      <br />
                      <div align="center">
                        <table class="desc">
                          <caption>
                            Fields: Link Message
                          </caption>
	                      <tr>
                            <th width="30%">Field Name</th>
                            <th>Description</th>
	                      </tr>

	                      <tr>
	                        <td><p>Version</p></td>
	                        <td><p>The version number for this message. This document describes version 1.</p>
	                        </td>
	                      </tr>

	                      <tr>
	                        <td><p>Flags</p></td>
	                        <td><p>This field contains information about the link and controls
                                the presence of other fields below.
                                <table class="list">
                                  <tr>
                                    <th width="20%" align="center">Bits</th>
                                    <th width="80%" align="left">Description</th>
                                  </tr>

                                  <tr>
                                    <td align="center"><code>0-1</code></td>
                                    <td>Determines the size of the <em>Length of Link Name</em>
                                      field.
                                      <table class="list">
                                        <tr>
                                          <th width="20%" align="center">Value</th>
                                          <th width="80%" align="left">Description</th>
                                        </tr>

                                        <tr>
                                          <td align="center"><code>0</code></td>
                                          <td>The size of the <em>Length of Link Name</em>
                                            field is 1 byte.
                                          </td>
                                        </tr>
                                        <tr>
                                          <td align="center"><code>1</code></td>
                                          <td>The size of the <em>Length of Link Name</em>
                                            field is 2 bytes.
                                          </td>
                                        </tr>
                                        <tr>
                                          <td align="center"><code>2</code></td>
                                          <td>The size of the <em>Length of Link Name</em>
                                            field is 4 bytes.
                                          </td>
                                        </tr>
                                        <tr>
                                          <td align="center"><code>3</code></td>
                                          <td>The size of the <em>Length of Link Name</em>
                                            field is 8 bytes.
                                          </td>
                                        </tr>
                                      </table>
                                    </td>
                                  </tr>
                                  <tr>
                                    <td align="center"><code>2</code></td>
                                    <td>Creation Order Field Present: if set, the <em>Creation
                                        Order</em> field is present.  If not set, creation order
                                      information is not stored for links in this group.
                                    </td>
                                  </tr>
                                  <tr>
                                    <td align="center"><code>3</code></td>
                                    <td>Link Type Field Present: if set, the link is not
                                      a hard link and the <em>Link Type</em> field is present.
                                      If not set, the link is a hard link.
                                    </td>
                                  </tr>
                                  <tr>
                                    <td align="center"><code>4</code></td>
                                    <td>Link Name Character Set Field Present: if set, the
                                      link name is not represented with the ASCII character
                                      set and the <em>Link Name Character Set</em> field is
                                      present.  If not set, the link name is represented with
                                      the ASCII character set.
                                    </td>
                                  </tr>
                                  <tr>
                                    <td align="center"><code>5-7</code></td>
                                    <td>Reserved (zero).
                                    </td>
                                  </tr>
                              </table></p>

                            </td>
	                      </tr>

	                      <tr>
	                        <td><p>Link type</p></td>
	                        <td><p>This is the link class type and can be one of the following
                                values:
                                <table class="list">
                                  <tr>
                                    <th width="20%" align="center">Value</th>
                                    <th width="80%" align="left">Description</th>
                                  </tr>

                                  <tr>
                                    <td align="center"><code>0</code></td>
                                    <td>A hard link (should never be stored in the file)
                                    </td>
                                  </tr>
                                  <tr>
                                    <td align="center"><code>1</code></td>
                                    <td>A soft link.
                                    </td>
                                  </tr>
                                  <tr>
                                    <td align="center"><code>2-63</code></td>
                                    <td>Reserved for future HDF5 internal use.
                                    </td>
                                  </tr>
                                  <tr>
                                    <td align="center"><code>64</code></td>
                                    <td>An external link.
                                    </td>
                                  </tr>
                                  <tr>
                                    <td align="center"><code>65-255</code></td>
                                    <td>Reserved, but available for user-defined link types.
                                    </td>
                                  </tr>
                              </table></p>

	                          <p>This field is present if bit 3 of <em>Flags</em> is set.</p>
	                        </td>
	                      </tr>

	                      <tr>
	                        <td><p>Creation Order</p></td>
	                        <td><p>This 64-bit value is an index of the link&rsquo;s creation time within
                                the group.  Values start at 0 when the group is created an increment
                                by one for each link added to the group.  Removing a link from a
                                group does not change existing links&rsquo; creation order field.
                              </p>
	                          <p>This field is present if bit 2 of <em>Flags</em> is set.</p>
	                        </td>
	                      </tr>

	                      <tr>
	                        <td><p>Link Name Character Set</p></td>
	                        <td><p>This is the character set for encoding the link&rsquo;s name:
                                <table class="list">
                                  <tr>
                                    <th width="20%" align="center">Value</th>
                                    <th width="80%" align="left">Description</th>
                                  </tr>

                                  <tr>
                                    <td align="center"><code>0</code></td>
                                    <td>ASCII character set encoding (this should never be stored
                                      in the file)
                                    </td>
                                  </tr>

                                  <tr>
                                    <td align="center"><code>1</code></td>
                                    <td>UTF-8 character set encoding
                                    </td>
                                  </tr>
                              </table></p>

	                          <p>This field is present if bit 4 of <em>Flags</em> is set.</p>
	                        </td>
	                      </tr>

	                      <tr>
	                        <td><p>Length of link name</p></td>
	                        <td><p>This is the length of the link&rsquo;s name.  The size of this field
	                            depends on bits 0 and 1 of <em>Flags</em>.</p>
	                        </td>
	                      </tr>

	                      <tr>
	                        <td><p>Link name</p></td>
	                        <td><p>This is the name of the link, non-NULL terminated.</p>
	                        </td>
	                      </tr>

	                      <tr>
	                        <td><p>Link information</p></td>
	                        <td><p>The format of this field depends on the <em>link type</em>.</p>
                              <p>For <b>hard</b> links, the field is formatted as follows:

                                <table class="list">
                                  <tr>
                                    <td width="20%"><i><a href="#SizeOfOffsetsV0">
                                          Size of Offsets</a></i> bytes:</td>
                                    <td width="80%">The address of the object header for the object that the
                                      link points to.
                                    </td>
                                  </tr>
                                </table>
                              </p>

                              <p>
                                For <b>soft</b> links, the field is formatted as follows:

                                <table class="list">
                                  <tr>
                                    <td width="20%">Bytes 1-2:</td>
                                    <td width="80%">Length of soft link value.</td>
                                  </tr>
                                  <tr>
                                    <td><em>Length of soft link value</em> bytes:</td>
                                    <td>A non-NULL-terminated string storing the value of the
                                      soft link.
                                    </td>
                                  </tr>
                                </table>
                              </p>

                              <p>
                                For <b>external</b> links, the field is formatted as follows:

                                <table class="list">
                                  <tr>
                                    <td width="20%">Bytes 1-2:</td>
                                    <td width="80%">Length of external link value.</td>
                                  </tr>
                                  <tr>
                                    <td><em>Length of external link value</em> bytes:</td>
                                    <td>The first byte contains the version number in the
                                      upper 4 bits and flags in the lower 4 bits for the external
                                      link. Both version and flags are defined to be zero in
                                      this document. The remaining bytes consist of two
                                      NULL-terminated strings, with no padding between them.
                                      The first string is the name of the HDF5 file containing
                                      the object linked to and the second string is the full path
                                      to the object linked to, within the HDF5 file&rsquo;s
                                      group hierarchy.
                                    </td>
                                  </tr>
                                </table>
                              </p>

                              <p>
                                For <b>user-defined</b> links, the field is formatted as follows:

                                <table class="list">
                                  <tr>
                                    <td width="20%">Bytes 1-2:</td>
                                    <td width="80%">Length of user-defined data.</td>
                                  </tr>
                                  <tr>
                                    <td><em>Length of user-defined link value</em> bytes:</td>
                                    <td>The data supplied for the user-defined link type.</td>
                                  </tr>
                                </table>
                              </p>

                            </td>
                          </tr>
                        </table>
                      </div>

                      <h4><a name="ExternalFileListMessage">IV.A.2.h. The Data Storage -
                          External Data Files Message</a></h4>

                      <!-- start msgdesc table -->
                      <center>
                        <table class="msgdesc">
                          <tr><td colspan="2"><b>Header Message Name:</b> External
                              Data Files</td></tr>
                          <tr><td colspan="2"><b>Header Message Type:</b> 0x0007</td></tr>
                          <tr><td colspan="2"><b>Length:</b> Varies</td></tr>
                          <tr><td colspan="2"><b>Status:</b> Optional; may not be
                              repeated.</td></tr>
                          <tr><td><b>Description:</b></td>
                            <td>The external data storage message indicates that the data
                              for an object is stored outside the HDF5 file. The filename of
                              the object is stored as a Universal Resource Location (URL) of
                              the actual filename containing the data. An external file list
                              record also contains the byte offset of the start of the data
                              within the file and the amount of space reserved in the file
                              for that data.</td></tr>
                          <tr><td colspan="2"><b>Format of Data:</b> See the tables
                              below.</td></tr>
                      </table></center>
                      <!-- end msgdesc table -->

                      <div align="center">
                        <table class="format">
                          <caption>
                            Layout: External File List Message
                          </caption>

	                      <tr>
	                        <th width="25%">byte</th>
	                        <th width="25%">byte</th>
	                        <th width="25%">byte</th>
	                        <th width="25%">byte</th>
	                      </tr>

	                      <tr>
	                        <td>Version</td>
	                        <td colspan="3">Reserved (zero)</td>
	                      </tr>

	                      <tr>
	                        <td colspan="2">Allocated Slots</td>
	                        <td colspan="2">Used Slots</td>
	                      </tr>

	                      <tr>
	                        <td colspan="4"><br />Heap Address<sup>O</sup><br /><br /></td>
	                      </tr>

	                      <tr>
	                        <td colspan="4"><br />Slot Definitions...<br /><br /></td>
	                      </tr>
                        </table>

                        <table class="note">
                          <tr>
                            <td width="60%">&nbsp;</td>
                            <td width="40%">
                              (Items marked with an &lsquo;O&rsquo; in the above table are
                              of the size specified in the <a href="#SizeOfOffsetsV0">Size
                                of Offsets</a> field in the superblock.)
                          </td></tr>
                        </table>

                      </div>

                      <br />
                      <div align="center">
	                    <table class="desc">
                          <caption>
                            Fields: External File List Message
                          </caption>
	                      <tr>
	                        <th width="30%">Field Name</th>
	                        <th>Description</th>
	                      </tr>

	                      <tr>
	                        <td><p>Version</p></td>
	                        <td>
	                          <p>The version number information is used for changes in the format of
                                External Data Storage Message and is described here:
		                        <table class="list">
		                          <tr>
			                        <th width="20%" align="center">Version</th>
			                        <th width="80%" align="left">Description</th>
		                          </tr>
		                          <tr>
			                        <td align="center"><code>0</code></td>
			                        <td>Never used.</td>
		                          </tr>
		                          <tr>
			                        <td align="center"><code>1</code></td>
			                        <td>The current version used by the library.</td>
		                          </tr>
		                      </table></p>

	                        </td>
	                      </tr>

	                      <tr>
	                        <td><p>Allocated Slots</p></td>
	                        <td>
	                          <p>The total number of slots allocated in the message.  Its value must be at least as
		                        large as the value contained in the Used Slots field. (The current library simply
		                        uses the number of Used Slots for this message)</p>
	                        </td>
	                      </tr>

	                      <tr>
	                        <td><p>Used Slots</p></td>
	                        <td>
	                          <p>The number of initial slots which contains valid information.</p>
	                        </td>
	                      </tr>

	                      <tr>
	                        <td><p>Heap Address</p></td>
	                        <td>
	                          <p>This is the address of a local heap which contains the names for the external
		                        files (The local heap information can be found in Disk Format Level 1D in this
		                        document).  The name at offset zero in the heap is always the empty string.</p>
	                        </td>
	                      </tr>

	                      <tr>
	                        <td><p>Slot Definitions</p></td>
	                        <td>
	                          <p>The slot definitions are stored in order according to the array addresses they
		                        represent.</p>
	                        </td>
	                      </tr>

	                    </table>
                      </div>

                      <br />
                      <br />
                      <br />
                      <div align="center">
                        <table class="format">
                          <caption>
                            Layout: External File List Slot
                          </caption>

	                      <tr>
	                        <th width="25%">byte</th>
	                        <th width="25%">byte</th>
	                        <th width="25%">byte</th>
	                        <th width="25%">byte</th>
	                      </tr>

	                      <tr>
	                        <td colspan="4"><br />Name Offset in Local Heap<sup>L</sup><br /><br /></td>
	                      </tr>

	                      <tr>
	                        <td colspan="4"><br />Offset in External Data File<sup>L</sup><br /><br /></td>
	                      </tr>

	                      <tr>
	                        <td colspan="4"><br />Data Size in External File<sup>L</sup><br /><br /></td>
	                      </tr>
                        </table>

                        <table class="note">
                          <tr>
                            <td width="60%">&nbsp;</td>
                            <td width="40%">
                              (Items marked with an &lsquo;L&rsquo; in the above table are
                              of the size specified in the <a href="#SizeOfLengthsV0">Size
                                of Lengths</a> field in the superblock.)
                          </td></tr>
                        </table>

                      </div>

                      <br />
                      <div align="center">
	                    <table class="desc">
                          <caption>
                            Fields: External File List Slot
                          </caption>
	                      <tr>
	                        <th width="30%">Field Name</th>
	                        <th>Description</th>
	                      </tr>

	                      <tr>
	                        <td><p>Name Offset in Local Heap</p></td>
	                        <td>
		                      <p>The byte offset within the local name heap for the name
	    	                    of the file.  File names are stored as a URL which has a
	    	                    protocol name, a host name, a port number, and a file
	    	                    name:
		                        <code><em>protocol</em>:<em>port</em>//<em>host</em>/<em>file</em></code>.
		                        If the protocol is omitted then &ldquo;file:&rdquo; is assumed.  If
		                        the port number is omitted then a default port for that
		                        protocol is used.  If both the protocol and the port
		                        number are omitted then the colon can also be omitted. If
		                        the double slash and host name are omitted then
		                        &ldquo;localhost&rdquo; is assumed.  The file name is the only
		                        mandatory part, and if the leading slash is missing then
		                        it is relative to the application&rsquo;s current working
		                        directory (the use of relative names is not
		                        recommended).
                              </p>
	                        </td>
	                      </tr>

	                      <tr>
	                        <td><p>Offset in External Data File</p></td>
	                        <td>
	  	                      <p>This is the byte offset to the start of the data in the
	                            specified file. For files that contain data for a single
	                            dataset this will usually be zero.</p>
	                        </td>
	                      </tr>

	                      <tr>
	                        <td><p>Data Size in External File</p></td>
	                        <td>
		                      <p>This is the total number of bytes reserved in the
		                        specified file for raw data storage.  For a file that
		                        contains exactly one complete dataset which is not
		                        extendable, the size will usually be the exact size of the
		                        dataset.  However, by making the size larger one allows
		                        HDF5 to extend the dataset. The size can be set to a value
		                        larger than the entire file since HDF5 will read zeroes
		                        past the end of the file without failing.</p>
	                        </td>
	                      </tr>
	                    </table>
                      </div>


                      <h4><a name="LayoutMessage">IV.A.2.i. The Data Layout Message</a></h4>

                      <!-- start msgdesc table -->
                      <center>
                        <table class="msgdesc">
                          <tr><td colspan="2"><b>Header Message Name:</b> Data Layout</td></tr>
                          <tr><td colspan="2"><b>Header Message Type:</b> 0x0008</td></tr>
                          <tr><td colspan="2"><b>Length:</b> Varies</td></tr>
                          <tr><td colspan="2"><b>Status:</b> Required for datasets; may not
                              be repeated.</td></tr>
                          <tr><td><b>Description:</b></td>
                            <td>The Data Layout message
                              describes how the elements of a multi-dimensional array are stored
                              in the HDF5 file. Four types of data layout are supported:
                              <ol>
                                <li>Contiguous: The array is stored in one contiguous area of
                                  the file. This layout requires that the size of the array be
                                  constant: data manipulations such as chunking, compression,
                                  checksums, or encryption are not permitted. The message stores
                                  the total storage size of the array. The offset of an element
                                  from the beginning of the storage area is computed as in a C
                                  array.</li>
                                <li>Chunked: The array domain is regularly decomposed into
                                  chunks, and each chunk is allocated and stored separately. This
                                  layout supports arbitrary element traversals, compression,
                                  encryption, and checksums (these features are described
                                  in other messages). The message stores the size of a chunk
                                  instead of the size of the entire array; the storage size of
                                  the entire array can be calculated by traversing the chunk index
                                  that stores the chunk addresses.</li>
                                <li>Compact: The array is stored in one contiguous block as
                                  part of this object header message.</li>
                                <li>Virtual: This is only supported for version 4 of the Data
                                  Layout message. The message stores information that is used to
                                  locate the global heap collection containing the Virtual Dataset
                                  (VDS) mapping information. The mapping associates the VDS to
                                  the source dataset elements that are stored across a collection
                                  of HDF5 files.</li>
                          </ol></td></tr>
                          <tr><td colspan="2"><b>Format of Data:</b> See the tables
                              below.</td></tr>
                      </table></center>
                      <!-- end msgdesc table -->

                      <div align="center">
                        <table class="format">
                          <caption>
                            Layout: Data Layout Message (Versions 1 and 2)
                          </caption>

	                      <tr>
	                        <th width="25%">byte</th>
	                        <th width="25%">byte</th>
	                        <th width="25%">byte</th>
	                        <th width="25%">byte</th>
	                      </tr>

	                      <tr>
	                        <td>Version</td>
	                        <td>Dimensionality</td>
	                        <td>Layout Class</td>
	                        <td>Reserved <em>(zero)</em></td>
	                      </tr>

	                      <tr>
	                        <td colspan="4">Reserved <em>(zero)</em></td>
	                      </tr>

	                      <tr>
	                        <td colspan="4"><br />Data Address<sup>O</sup> <em>(optional)</em><br /><br /></td>
	                      </tr>

	                      <tr>
	                        <td colspan="4">Dimension 1 Size</td>
	                      </tr>

	                      <tr>
	                        <td colspan="4">Dimension 2 Size</td>
	                      </tr>

	                      <tr>
	                        <td colspan="4">...</td>
	                      </tr>

	                      <tr>
	                        <td colspan="4">Dimension #n Size</td>
	                      </tr>

	                      <tr>
	                        <td colspan="4">Dataset Element Size <em>(optional)</em></td>
	                      </tr>

	                      <tr>
	                        <td colspan="4">Compact Data Size <em>(optional)</em></td>
	                      </tr>

	                      <tr>
	                        <td colspan="4"><br />Compact Data... <em>(variable size, optional)</em><br /><br /></td>
	                      </tr>
                        </table>

                        <table class="note">
                          <tr>
                            <td width="60%">&nbsp;</td>
                            <td width="40%">
                              (Items marked with an &lsquo;O&rsquo; in the above table are
                              of the size specified in the <a href="#SizeOfOffsetsV0">Size
                                of Offsets</a> field in the superblock.)
                          </td></tr>
                        </table>

                      </div>

                      <br />
                      <div align="center">
                        <table class="desc">
                          <caption>
                            Fields: Data Layout Message (Versions 1 and 2)
                          </caption>
	                      <tr>
	                        <th width="30%">Field Name</th>
	                        <th>Description</th>
	                      </tr>

	                      <tr>
	                        <td><p>Version</p></td>
	                        <td>
	                          <p>The version number information is used for changes in the format of the data
	                            layout message and is described here:
	                            <table class="list">
		                          <tr>
		                            <th width="20%" align="center">Version</th>
		                            <th width="80%" align="left">Description</th>
		                          </tr>

		                          <tr>
		                            <td align="center"><code>0</code></td>
		                            <td>Never used.</td>
		                          </tr>

		                          <tr>
		                            <td align="center"><code>1</code></td>
		                            <td>Used by version 1.4 and before of the library to encode layout information.
		                              Data space is always allocated when the data set is created.</td>
		                          </tr>

		                          <tr>
		                            <td align="center"><code>2</code></td>
		                            <td>Used by version 1.6.[0,1,2] of the library to encode layout information.
		                              Data space is allocated only when it is necessary.</td>
		                          </tr>
	                          </table></p>
	                        </td>
	                      </tr>

	                      <tr>
	                        <td><p>Dimensionality</p></td>
	                        <td><p>An array has a fixed dimensionality.  This field
	                            specifies the number of dimension size fields later in the
	                            message. The value stored for chunked storage is 1 greater than
                                the number of dimensions in the dataset&rsquo;s dataspace.
                                For example, 2 is stored for a 1 dimensional dataset.
                              </p>
                            </td>
	                      </tr>

	                      <tr>
	                        <td><p>Layout Class</p></td>
	                        <td><p>The layout class specifies the type of storage for the data
                                and how the other fields of the layout message are to be
                                interpreted.

	                            <table class="list">
		                          <tr>
		                            <th width="20%" align="center">Value</th>
		                            <th width="80%" align="left">Description</th>
		                          </tr>

		                          <tr>
		                            <td align="center"><code>0</code></td>
		                            <td>Compact Storage
                                    </td>
		                          </tr>

		                          <tr>
		                            <td align="center"><code>1</code></td>
		                            <td>Contiguous Storage
                                    </td>
		                          </tr>

		                          <tr>
		                            <td align="center"><code>2</code></td>
		                            <td>Chunked Storage
                                    </td>
		                          </tr>
	                            </table>
                              </p>
                            </td>
	                      </tr>

	                      <tr>
	                        <td><p>Data Address</p></td>
	                        <td><p>For contiguous storage, this is the address of the raw
	                            data in the file.  For chunked storage this is the address
	                            of the <a href="#V1Btrees">v1 B-tree</a> that is used to look up the addresses of the
	                            chunks.  This field is not present for compact storage.
                                If the version for this message is greater than 1, the address
                                may have the &ldquo;undefined address&rdquo; value, to indicate that
                                storage has not yet been allocated for this array.</p>
                            </td>
	                      </tr>

	                      <tr>
	                        <td><p>Dimension #n Size</p></td>
	                        <td><p>For contiguous and compact storage the dimensions define
                                the entire size of the array while for chunked storage they define
                                the size of a single chunk.  In all cases, they are in units of
                                array elements (not bytes).  The first dimension stored in the list
                                of dimensions is the slowest changing dimension and the last
                                dimension stored is the fastest changing dimension.
                              </p>
                            </td>
	                      </tr>

	                      <tr>
	                        <td><p>Dataset Element Size</p></td>
	                        <td><p>The size of a dataset element, in bytes.  This field is only
                                present for chunked storage.
                              </p>
                            </td>
	                      </tr>

	                      <tr>
	                        <td><p>Compact Data Size</p></td>
	                        <td><p>This field is only present for compact data storage.
                                It contains the size of the raw data for the dataset array, in
                                bytes.</p>
                            </td>
                          </tr>

	                      <tr>
	                        <td><p>Compact Data</p></td>
	                        <td><p>This field is only present for compact data storage.
                                It contains the raw data for the dataset array.</p>
                            </td>
	                      </tr>
                        </table>
                      </div>

                      <br />
                      <p>Version 3 of this message re-structured the format into specific
                        properties that are required for each layout class.</p>


                      <div align="center">
                        <table class="format">
                          <caption>
                            Layout: Data Layout Message (Version 3)
                          </caption>

	                      <tr>
	                        <th width="25%">byte</th>
	                        <th width="25%">byte</th>
	                        <th width="25%">byte</th>
	                        <th width="25%">byte</th>
	                      </tr>

	                      <tr>
	                        <td>Version</td>
	                        <td>Layout Class</td>
                            <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
	                      </tr>

	                      <tr>
	                        <td colspan="4"><br />Properties <em>(variable size)</em><br /><br /></td>
	                      </tr>
                        </table>
                      </div>

                      <br />
                      <div align="center">
                        <table class="desc">
                          <caption>
                            Fields: Data Layout Message (Version 3)
                          </caption>
	                      <tr>
	                        <th width="30%">Field Name</th>
	                        <th>Description</th>
	                      </tr>

	                      <tr>
	                        <td><p>Version</p></td>
	                        <td>
	                          <p>The version number information is used for changes in the format of layout message
	                            and is described here:
	                            <table class="list">
		                          <tr>
		                            <th width="20%" align="center">Version</th>
		                            <th width="80%" align="left">Description</th>
		                          </tr>

		                          <tr>
		                            <td align="center"><code>3</code></td>
		                            <td>Used by the version 1.6.3 and later of the library to store properties
		                              for each layout class.</td>
		                          </tr>
	                          </table></p>
	                        </td>
	                      </tr>

	                      <tr>
	                        <td><p>Layout Class</p></td>
	                        <td><p>The layout class specifies the type of storage for the data
                                and how the other fields of the layout message are to be
                                interpreted.
	                            <table class="list">
		                          <tr>
		                            <th width="20%" align="center">Value</th>
		                            <th width="80%" align="left">Description</th>
		                          </tr>

		                          <tr>
		                            <td align="center"><code>0</code></td>
		                            <td>Compact Storage
                                    </td>
		                          </tr>

		                          <tr>
		                            <td align="center"><code>1</code></td>
		                            <td>Contiguous Storage
                                    </td>
		                          </tr>

		                          <tr>
		                            <td align="center"><code>2</code></td>
		                            <td>Chunked Storage
                                    </td>
		                          </tr>
	                            </table>
                              </p>
                            </td>
	                      </tr>

	                      <tr>
	                        <td><p>Properties</p></td>
	                        <td><p>This variable-sized field encodes information specific to each
                                layout class and is described below.  If there is no property
                                information specified for a layout class, the size of this field
                                is zero bytes.</p></td>
	                      </tr>
                        </table>
                      </div>

                      <br />
                      <a name="CompactStorage"></a>
                      <p>Class-specific information for compact storage (layout class 0):  (Note: The dimensionality information
                        is in the Dataspace message)</p>


                      <div align="center">
                        <table class="format">
                          <caption>
                            Layout: Compact Storage Property Description
                          </caption>

	                      <tr>
	                        <th width="25%">byte</th>
	                        <th width="25%">byte</th>
	                        <th width="25%">byte</th>
	                        <th width="25%">byte</th>
	                      </tr>

	                      <tr>
	                        <td colspan="2">Size</td>
                            <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
	                      </tr>

	                      <tr>
	                        <td colspan="4"><br />Raw Data... <em>(variable size)</em><br /><br /></td>
	                      </tr>
                        </table>
                      </div>

                      <br />
                      <div align="center">
                        <table class="desc">
                          <caption>
                            Fields: Compact Storage Property Description
                          </caption>
	                      <tr>
                            <th width="30%">Field Name</th>
                            <th>Description</th>
	                      </tr>

	                      <tr>
	                        <td><p>Size</p></td>
	                        <td><p>This field contains the size of the raw data for the dataset
                                array, in bytes.
                              </p>
                            </td>
	                      </tr>

	                      <tr>
	                        <td><p>Raw Data</p></td>
	                        <td><p>This field contains the raw data for the dataset array.</p></td>
	                      </tr>
                        </table>
                      </div>


                      <br />
                      <a name="ContiguousStorage"></a>
                      <p>Class-specific information for contiguous storage (layout class 1):
                        (Note: The dimensionality information is in the Dataspace message)</p>


                      <div align="center">
                        <table class="format">
                          <caption>
                            Layout: Contiguous Storage Property Description
                          </caption>

	                      <tr>
	                        <th width="25%">byte</th>
	                        <th width="25%">byte</th>
	                        <th width="25%">byte</th>
	                        <th width="25%">byte</th>
	                      </tr>

	                      <tr>
	                        <td colspan="4"><br />Address<sup>O</sup><br /><br /></td>
	                      </tr>

	                      <tr>
	                        <td colspan="4"><br />Size<sup>L</sup><br /><br /></td>
	                      </tr>
                        </table>

                        <table class="note">
                          <tr>
                            <td width="60%">&nbsp;</td>
                            <td width="40%">
                              (Items marked with an &lsquo;O&rsquo; in the above table are
                              of the size specified in the <a href="#SizeOfOffsetsV0">Size
                                of Offsets</a> field in the superblock.)
                          </td></tr>
                          <tr>
                            <td>&nbsp;</td>
                            <td>
                              (Items marked with an &lsquo;L&rsquo; in the above table are
                              of the size specified in the <a href="#SizeOfLengthsV0">Size
                                of Lengths</a> field in the superblock.)
                          </td></tr>
                        </table>
                      </div>

                      <br />
                      <div align="center">
                        <table class="desc">
                          <caption>
                            Fields: Contiguous Storage Property Description
                          </caption>
	                      <tr>
                            <th width="30%">Field Name</th>
                            <th>Description</th>
	                      </tr>

	                      <tr>
	                        <td><p>Address</p></td>
	                        <td><p>This is the address of the raw data in the file.
                                The address may have the &ldquo;undefined address&rdquo; value, to indicate
                                that storage has not yet been allocated for this array.</p></td>
	                      </tr>

	                      <tr>
	                        <td><p>Size</p></td>
	                        <td><p>This field contains the size allocated to store the raw data,
                                in bytes.
                              </p>
                            </td>
	                      </tr>
                        </table>
                      </div>


                      <br />
                      <p>Class-specific information for chunked storage (layout class 2):</p>


                      <div align="center">
                        <table class="format">
                          <caption>
                            Layout: Chunked Storage Property Description
                          </caption>

	                      <tr>
	                        <th width="25%">byte</th>
	                        <th width="25%">byte</th>
	                        <th width="25%">byte</th>
	                        <th width="25%">byte</th>
	                      </tr>

	                      <tr>
	                        <td>Dimensionality</td>
                            <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
	                      </tr>

	                      <tr>
	                        <td colspan="4"><br />Address<sup>O</sup><br /><br /></td>
	                      </tr>

	                      <tr>
	                        <td colspan="4">Dimension 0 Size</td>
	                      </tr>

	                      <tr>
	                        <td colspan="4">Dimension 1 Size</td>
	                      </tr>

	                      <tr>
	                        <td colspan="4">...</td>
	                      </tr>

	                      <tr>
	                        <td colspan="4">Dimension #n Size</td>
	                      </tr>

	                      <tr>
	                        <td colspan="4">Dataset Element Size</td>
	                      </tr>
                        </table>

                        <table class="note">
                          <tr>
                            <td width="60%">&nbsp;</td>
                            <td width="40%">
                              (Items marked with an &lsquo;O&rsquo; in the above table are
                              of the size specified in the <a href="#SizeOfOffsetsV0">Size
                                of Offsets</a> field in the superblock.)
                          </td></tr>
                        </table>

                      </div>

                      <br />
                      <div align="center">
                        <table class="desc">
                          <caption>
                            Fields: Chunked Storage Property Description
                          </caption>
	                      <tr>
                            <th width="30%">Field Name</th>
                            <th>Description</th>
	                      </tr>

	                      <tr>
	                        <td><p>Dimensionality</p></td>
	                        <td><p>A chunk has a fixed dimensionality.  This field specifies
	                            the number of dimension size fields later in the message.</p></td>
	                      </tr>

	                      <tr>
	                        <td><p>Address</p></td>
	                        <td><p>This is the address of the <a href="#V1Btrees">v1 B-tree</a>
	                            that is used to look up the
                                addresses of the chunks that actually store portions of the array
                                data.  The address may have the &ldquo;undefined address&rdquo; value, to
                                indicate that storage has not yet been allocated for this array.</p></td>
	                      </tr>

	                      <tr>
	                        <td><p>Dimension #n Size</p></td>
	                        <td><p>These values define the dimension size of a single chunk, in
                                units of array elements (not bytes).  The first dimension stored in
                                the list of dimensions is the slowest changing dimension and the
                                last dimension stored is the fastest changing dimension.
                              </p>
                            </td>
	                      </tr>

	                      <tr>
	                        <td><p>Dataset Element Size</p></td>
	                        <td><p>The size of a dataset element, in bytes.
                              </p>
                            </td>
	                      </tr>
                        </table>
                      </div>


                      <br />

                      <p><a name="DataLayoutV4">
                          Version 4</a> of this message is similar to version 3 but has
                        additional information for the virtual layout class as well as
                        indexing information for the chunked layout class.</p>

                      <div align="center">
                        <table class="format">
                          <caption>
                            Layout: Data Layout Message (Version 4)
                          </caption>

	                      <tr>
	                        <th width="25%">byte</th>
	                        <th width="25%">byte</th>
	                        <th width="25%">byte</th>
	                        <th width="25%">byte</th>
	                      </tr>

	                      <tr>
	                        <td>Version</td>
	                        <td>Layout Class</td>
                            <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
                                only to align table nicely</em></td>
	                      </tr>

	                      <tr>
	                        <td colspan="4"><br />Properties <em>(variable size)</em><br /><br /></td>
	                      </tr>
                        </table>
                      </div>

                      <br />
                      <div align="center">
                        <table class="desc">
                          <caption>
                            Fields: Data Layout Message (Version 4)
                          </caption>
	                      <tr>
	                        <th width="30%">Field Name</th>
	                        <th>Description</th>
	                      </tr>

	                      <tr>
	                        <td><p>Version</p></td>
	                        <td>
	                          <p>The value for this field is 4 and is used by version 1.10.0
                                and later of the library to store properties for each layout
                                class and indexing information for the chunked layout.
	                          </p>
	                        </td>
	                      </tr>

	                      <tr>
	                        <td><p>Layout Class</p></td>
	                        <td><p>The layout class specifies the type of storage for the data
                                and how the other fields of the layout message are to be
                                interpreted.
	                            <table class="list">
                                  <tr>
                                    <th width="20%" align="center">Value</th>
                                    <th width="80%" align="left">Description</th>
                                  </tr>

                                  <tr>
                                    <td align="center"><code>0</code></td>
                                    <td>Compact Storage
                                    </td>
                                  </tr>

                                  <tr>
                                    <td align="center"><code>1</code></td>
                                    <td>Contiguous Storage
                                    </td>
                                  </tr>

                                  <tr>
                                    <td align="center"><code>2</code></td>
                                    <td>Chunked Storage
                                    </td>
                                  </tr>
                                  <tr>
                                    <td align="center"><code>3</code></td>
                                    <td>Virtual Storage
                                    </td>
                                  </tr>
                                </table>
                              </p>
                            </td>
	                      </tr>

	                      <tr>
	                        <td><p>Properties</p></td>
	                        <td><p>This variable-sized field encodes information specific to a
                                layout class as follows:
	                            <table class="list">
                                  <tr>
                                    <th align="left" width="20%">Layout Class</th>
                                    <th align="left" width="80%">Description</th>
                                  </tr>

                                  <tr>
                                    <td align="left">Compact Storage</td>
                                    <td>See <a href="#CompactStorage">Compact Storage
                                        Property Description</i></a> for the version 3
Data Layout message.
</td>
</tr>

<tr>
  <td align="left">Contiguous Storage</td>
  <td>See <a href="#ContiguousStorage">Contiguous Storage
      Property Description</i></a> for the version 3
Data Layout message.
</td>
</tr>

<tr>
  <td align="left">Chunked Storage</td>
  <td>See <a href="#ChunkedStorage">Chunked Storage
      Property Description</i></a> below.
</td>
</tr>

<tr>
  <td align="left">Virtual Storage</td>
  <td>See <a href="#VirtualStorage">Virtual Storage
      Property Description</i></a> below.
</td>
</tr>
</table>

</p></td>
</tr>
</table>
</div>

<br />
<a name="ChunkedStorage"></a>
<p>Class-specific information for chunked storage (layout
  class 2):</p>

<div align="center">
  <table class="format">
    <caption>
      Layout: Chunked Storage Property Description
    </caption>

	<tr>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	</tr>

	<tr>
	  <td>Flags</td>
	  <td>Dimensionality</td>
	  <td>Dimension Size Encoded Length</td>
      <td colspan="1" bgcolor="#DDDDDD"><em>This space inserted to align table nicely</em></td>
	</tr>

	<tr>
	  <td colspan="4">Dimension 0 Size <em>(variable size)</em></td>
	</tr>

	<tr>
	  <td colspan="4">Dimension 1 Size <em>(variable size)</em></td>
	</tr>

	<tr>
	  <td colspan="4">...</td>
	</tr>

	<tr>
	  <td colspan="4">Dimension #n Size <em>(variable size)</em></td>
	</tr>

	<tr>
	  <td>Chunk Indexing Type</td>
      <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
	</tr>

	<tr>
	  <td colspan="4">Indexing Type Information <em>(variable size)</em></td>
	</tr>

	<tr>
	  <td colspan="4"><br />Address<sup>O</sup><br /><br /></td>
	</tr>
  </table>

</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Chunked Storage Property Description
    </caption>
	<tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
	</tr>

	<tr>
	  <td><p>Flags</p></td>
	  <td><p>This is the chunked layout feature flag:</p>

	    <table class="list">
		  <tr>
		    <th width="55%" align="left">Value</th>
		    <th width="45%" align="left">Description</th>
		  </tr>

		  <tr>
		    <td align="left"><code>DONT_FILTER_PARTIAL_BOUND_CHUNKS (bit 0)</code></td>
		    <td>Do not apply filter to a partial edge chunk.

            </td>
		  </tr>

		  <tr>
		    <td align="left"><code>SINGLE_INDEX_WITH_FILTER (bit 1)</code></td>
		    <td>A filtered chunk for <i>Single Chunk</i> indexing.
            </td>
		  </tr>

	    </table>

	  </td>

	</tr>

	<tr>
	  <td><p>Dimensionality</p></td>
	  <td><p>A chunk has fixed dimension.  This field specifies
	      the number of <em>Dimension Size</em> fields later in the message.</p></td>
	</tr>

	<tr>
	  <td><p>Dimension Size Encoded Length</p></td>
	  <td>
	    <p>This is the size in bytes used to encode <em>Dimension Size</em>.
        </p>
	  </td>
	</tr>

	<tr>
	  <td><p>Dimension #n Size</p></td>
	  <td><p>These values define the dimension size of a single chunk, in
          units of array elements (not bytes).  The first dimension stored in
          the list of dimensions is the slowest changing dimension and the
          last dimension stored is the fastest changing dimension.
        </p>
      </td>
	</tr>

	<tr>
	  <td><p>Chunk Indexing Type</p></td>
	  <td><p>There are five indexing types used to look up addresses
          of the chunks. For more information on each type, see
          <a href="#AppendixC">&ldquo;Appendix C: Types of Indexes for
            Dataset Chunks.&rdquo;</a>
	      <table class="list">
		    <tr>
		      <th width="20%" align="center">Value</th>
		      <th width="80%" align="left">Description</th>
		    </tr>

		    <tr>
		      <td align="center"><code>1</code></td>
		      <td><a href="#SingleChunk"><i>Single Chunk</i></a> indexing type.
              </td>
		    </tr>

		    <tr>
		      <td align="center"><code>2</code></td>
		      <td><a href="#Implicit"><i>Implicit</i></a> indexing type.
              </td>
		    </tr>

		    <tr>
		      <td align="center"><code>3</code></td>
		      <td><a href="#FixedArray"><i>Fixed Array</i></a> indexing type.
              </td>
		    </tr>

		    <tr>
		      <td align="center"><code>4</code></td>
		      <td><a href="#ExtensibleArray"><i>Extensible Array</i></a> indexing type.
              </td>
		    </tr>

		    <tr>
		      <td align="center"><code>5</code></td>
		      <td><a href="#V2Btrees"><i>Version 2 B-tree</i></a> indexing type.
              </td>
		    </tr>

	      </table>
        </p>
      </td>
	</tr>

	<tr>
	  <td><p>Indexing Type Information</p></td>
	  <td><p>This variable-sized field encodes information specific to
          an indexing type. More information on what is encoded with
          each type can be found below this table.
          <ul>
            <li>See <a href="#IndexInfoSingle"><i>Single Chunk</i></a> below.</li>
            <li>See <a href="#IndexInfoImplicit"><i>Implicit</i></a> below.</li>
            <li>See <a href="#IndexInfoFixed"><i>Fixed Array</i></a> below.</li>
            <li>See <a href="#IndexInfoExtensible"><i>Extensible Array</i></a> below.</li>
            <li>See <a href="#IndexInfoV2Btrees"><i>Version 2 B-tree</i></a> below.</li>
          </ul>
        </p>
      </td>
	</tr>

	<tr>
	  <td><p>Address</p></td>
	  <td><p>This is the address specific to an indexing type.
		  The address may be undefined if the chunk or index storage is not allocated yet.
	      <table class="list">
		    <tr>
		      <th width="40%" align="left">Value</th>
		      <th width="60%" align="left">Description</th>
		    </tr>

		    <tr>
		      <td align="left"><i>Single Chunk index</i></td>
		      <td align="left">Address of the single chunk.</td>
      </td>
	</tr>

	<tr>
	  <td align="left"><i>Implicit index</i></td>
	  <td align="left">Address of the array of dataset chunks.</td>
</td>
</tr>

<tr>
  <td align="left"><i>Fixed Array index</i></td>
  <td align="left">Address of the index.</td>
</tr>

<tr>
  <td align="left"><i>Extensible Array index</i></td>
  <td align="left">Address of the index.</td>
</td>
</tr>

<tr>
  <td align="left"><i>Version 2 B-tree index</i></td>
  <td align="left">Address of the index.</td>
</td>
</tr>

</table>

</p>
</td>
</tr>

</table>
</div>

<br />

<ol>
  <li>
    <a name="IndexInfoSingle"></a>
      Index-specific information for <i>Single Chunk</i>:
  </li>

  <p>The following information exists only when the chunk is filtered.
    In other words, when <code>DONT_FILTER_PARTIAL_BOUND_CHUNKS</code>
    (bit 0) is enabled in the field <em>flags</em>.</p>

  <div align="center">
    <table class="format">
      <caption>
        Layout: Single Chunk Indexing Information
      </caption>

	  <tr>
	    <th width="25%">byte</th>
	    <th width="25%">byte</th>
	    <th width="25%">byte</th>
	    <th width="25%">byte</th>
	  </tr>

	  <tr>
	    <td colspan="4"><br />Size of filtered chunk<sup>L</sup><br /><br /></td>
	  </tr>

	  <tr>
	    <td colspan="4">Filters for chunk</td>
	  </tr>

    </table>

    <table class="note">
      <tr>
        <td width="55%">&nbsp;</td>
        <td width="45%"> <!-- width is slightly different: these
                              tables are part of an ordered list; see <ol> tags. -->
            (Items marked with an &lsquo;L&rsquo; in the above table are
            of the size specified in the <a href="#SizeOfLengthsV0">Size
              of Lengths</a> field in the superblock.)
      </td></tr>
    </table>
  </div>

  <br />
  <div align="center">
    <table class="desc">
      <caption>
        Fields: Single Chunk Indexing Information
      </caption>
	  <tr>
        <th width="30%">Field Name</th>
        <th>Description</th>
	  </tr>

	  <tr>
	    <td><p>Size of filtered chunk</p></td>
	    <td><p>This field is the size of a filtered chunk.</p></td>
	  </tr>

	  <tr>
	    <td><p>Filters for chunk</p></td>
	    <td><p>This field contains filters for the chunk.</p></td>
	  </tr>
    </table>
  </div>
</p>

<br />

<li>
  <a name="IndexInfoImplicit"></a>
    Index-specific information for <i>Implicit</i>:
</li>

<div align="center">
  <table class="format">
    <caption>
      Layout: Implicit Indexing Information
    </caption>

	<tr>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	</tr>

	<tr>
      <td colspan="4" bgcolor="#DDDDDD">
        <em>No specific indexing information</em></td>
	</tr>

  </table>
</div>

<br />
<li>
  <a name="IndexInfoFixed"></a>
    Index-specific information for <i>Fixed Array</i>:
</li>

<div align="center">
  <table class="format">
    <caption>
      Layout: Fixed Array Indexing Information
    </caption>

	<tr>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	</tr>

	<tr>
	  <td colspan="1">Page Bits</td>
      <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
	</tr>

  </table>
</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Fixed Array Indexing Information
    </caption>
	<tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
	</tr>

	<tr>
	  <td><p>Page Bits</p></td>
	  <td><p>This field contains the number of bits needed to store the
	      maximum number of elements in a data block page.</p></td>
	</tr>

  </table>
</div>
</p>

<br />
<li>
  <a name="IndexInfoExtensible"></a>
    Index-specific information for <i>Extensible Array</i>:
</li>

<div align="center">
  <table class="format">
    <caption>
      Layout: Extensible Array Indexing Information
    </caption>

	<tr>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	</tr>

	<tr>
	  <td>Max Bits</td>
	  <td>Index Elements</td>
	  <td>Min Pointers</td>
	  <td>Min Elements</td>
	</tr>

	<td colspan="2">Page Bits</td>
    <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
</tr>

</table>
</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Extensible Array Indexing Information
    </caption>
	<tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
	</tr>

	<tr>
	  <td><p>Max Bits</p></td>
	  <td><p>This field contains the number of bits needed to store the maximum number of elements
          in the array.
        </p>
      </td>
	</tr>

	<tr>
	  <td><p>Index Elements</p></td>
	  <td><p>This field contains the number of elements to store in the
          index block.
        </p>
      </td>
	</tr>

	<tr>
	  <td><p>Min Pointers</p></td>
	  <td><p>This field contains the minimum number of data block pointers
          for a superblock.
        </p>
      </td>
	</tr>

	<tr>
	  <td><p>Min Elements</p></td>
	  <td><p>This field contains the minimum number of elements per data block.
        </p>
      </td>
	</tr>

	<tr>
	  <td><p>Page Bits</p></td>
	  <td><p>This field contains the number of bits needed to store the
	      maximum number of elements in a data block page.
        </p>
      </td>
	</tr>

  </table>
</div>
</p>
<br />

<li>
  <a name="IndexInfoV2Btrees"></a>
    Index-specific information for <i>Version 2 B-tree</i>:
</li>

<div align="center">
  <table class="format">
    <caption>
      Layout: Version 2 B-tree Indexing Information
    </caption>

	<tr>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	</tr>

	<tr>
	  <td colspan="4">Node Size</td>
	</tr>

	<tr>
	  <td>Split Percent</td>
	  <td>Merge Percent</td>
      <td colspan="2" bgcolor="#DDDDDD">
        <em>This space inserted only to align table nicely</em></td>
	</tr>
  </table>
</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Version 2 B-tree Indexing Information
    </caption>
	<tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
	</tr>

	<tr>
	  <td><p>Node Size</p></td>
	  <td><p>This field is the size in bytes of a B-tree node.
        </p>
      </td>
	</tr>

	<tr>
	  <td><p>Split Percent</p></td>
	  <td><p>This field is the percentage full of a B-tree node at which to split the node.</p></td>
	</tr>

	<tr>
	  <td><p>Merge Percent</p></td>
	  <td><p>This field is the percentage full of a B-tree node at which to merge the node.</p></td>
	</tr>
  </table>
</div>
</ol>



<br />
<a name="VirtualStorage"></a>
<p>
  Class-specific information for virtual storage (layout class 3):</p>

<div align="center">
  <table class="format">
    <caption>
      Layout: Virtual Storage Property Description
    </caption>

	<tr>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	</tr>

	<tr>
	  <td colspan="4"><br />Address<sup>O</sup><br /><br /></td>
	</tr>

	<tr>
	  <td colspan="4">Index</td>
	</tr>

  </table>

  <table class="note">
    <tr>
      <td width="60%">&nbsp;</td>
      <td width="40%">
        (Items marked with an &lsquo;O&rsquo; in the above table are
        of the size specified in the <a href="#SizeOfOffsetsV0">Size
          of Offsets</a> field in the superblock.)
    </td></tr>
  </table>
</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Virtual Storage Property Description
    </caption>
	<tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
	</tr>

	<tr>
	  <td><p>Address</p></td>
	  <td><p>This is the address of the global heap collection where
          the VDS mapping entries are stored.
	      See <a href="#GlobalHeapVDS">&ldquo;Disk Format: Level 1F -
            Global Heap Block for Virtual Datasets.&rdquo;</a>
	  </p></td>
	</tr>

	<tr>
	  <td><p>Index</p></td>
	  <td><p>This is the index of the data object within the global heap collection.
        </p>
      </td>
	</tr>
  </table>
</div>

<h4><a name="BogusMessage">IV.A.2.j. The Bogus Message</a></h4>

<!-- start msgdesc table -->
<center>
  <table class="msgdesc">
    <tr><td colspan="2"><b>Header Message Name:</b> Bogus</td></tr>
    <tr><td colspan="2"><b>Header Message Type:</b> 0x0009</td></tr>
    <tr><td colspan="2"><b>Length:</b> 4 bytes</td></tr>
    <tr><td colspan="2"><b>Status:</b> For testing only; should never
        be stored in a valid file.</td></tr>
    <tr><td><b>Description:</b></td>
      <td>This message is used for testing the HDF5 Library&rsquo;s
        response to an &ldquo;unknown&rdquo; message type and should
        never be encountered in a valid HDF5 file.</td></tr>
    <tr><td colspan="2"><b>Format of Data:</b> See the tables
        below.</td></tr>
</table></center>
<!-- end msgdesc table -->

<div align="center">
  <table class="format">
    <caption>
      Layout: Bogus Message
    </caption>

	<tr>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	</tr>

	<tr>
	  <td colspan="4">Bogus Value</td>
	</tr>
  </table>
</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Bogus Message
    </caption>
	<tr>
	  <th width="30%">Field Name</th>
	  <th>Description</th>
	</tr>

	<tr>
	  <td><p>Bogus Value</p></td>
	  <td>
	    <p>This value should always be: <code>0xdeadbeef</code>.</p>
	  </td>
	</tr>
  </table>
</div>

<h4><a name="GroupInfoMessage">IV.A.2.k. The Group Info Message
</a></h4>

<!-- start msgdesc table -->
<center>
  <table class="msgdesc">
    <tr><td colspan="2"><b>Header Message Name:</b> Group Info</td></tr>
    <tr><td colspan="2"><b>Header Message Type:</b> 0x000A</td></tr>
    <tr><td colspan="2"><b>Length:</b> Varies</td></tr>
    <tr><td colspan="2"><b>Status:</b> Optional; may not be
        repeated.</td></tr>
    <tr><td><b>Description:</b></td>
      <td><p>This message stores information for the constants defining
          a &ldquo;new style&rdquo; group&rsquo;s behavior. Constant
          information will be stored in this message and variable
          information will be stored in the
          <a href="#LinkInfoMessage">Link Info</a> message.</p>
        <p>Note: the &ldquo;estimated entry&rdquo; information below is
          used when determining the size of the object header for the
          group when it is created.</p></td></tr>
    <tr><td colspan="2"><b>Format of Data:</b> See the tables
        below.</td></tr>
</table></center>
<!-- end msgdesc table -->

<div align="center">
  <table class="format">
    <caption>
      Layout: Group Info Message
    </caption>

	<tr>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	</tr>

	<tr>
	  <td>Version</td>
	  <td>Flags</td>
	  <td colspan="2">Link Phase Change: Maximum Compact Value <em>(optional)</em></td>
	</tr>
	<tr>
	  <td colspan="2">Link Phase Change: Minimum Dense Value <em>(optional)</em></td>
	  <td colspan="2">Estimated Number of Entries <em>(optional)</em></td>
	</tr>
	<tr>
	  <td colspan="2">Estimated Link Name Length of Entries <em>(optional)</em></td>
      <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
	</tr>

  </table>
</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Group Info Message
    </caption>
	<tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
	</tr>

	<tr>
	  <td><p>Version</p></td>
	  <td><p>The version number for this message. This document describes version 0.</p>
	  </td>
	</tr>

	<tr>
	  <td><p>Flags</p></td>
	  <td><p>This is the group information flag with the following definition:

          <table class="list">
            <tr>
              <th width="20%" align="center">Bit</th>
              <th width="80%" align="left">Description</th>
            </tr>

            <tr>
              <td align="center"><code>0</code></td>
              <td>If set, link phase change values are stored.
              </td>
            </tr>
            <tr>
              <td align="center"><code>1</code></td>
              <td>If set, the estimated entry information is non-default
                and is stored.
              </td>
            </tr>
            <tr>
              <td align="center"><code>2-7</code></td>
              <td>Reserved</td>
            </tr>
	    </table></p>
      </td>
	</tr>

	<tr>
	  <td><p>Link Phase Change: Maximum Compact Value</p></td>
	  <td><p>The is the maximum number of links to store &ldquo;compactly&rdquo; (in
          the group&rsquo;s object header).</p>
	    <p>This field is present if bit 0 of <em>Flags</em> is set.</p>
	  </td>
	</tr>

	<tr>
	  <td><p>Link Phase Change: Minimum Dense Value</p></td>
	  <td><p>This is the minimum number of links to store &ldquo;densely&rdquo; (in
          the group&rsquo;s fractal heap).  The fractal heap&rsquo;s address is
          located in the <a href="#LinkInfoMessage">Link Info</a>
          message.</p>
	    <p>This field is present if bit 0 of <em>Flags</em> is set.</p>
	  </td>
	</tr>

	<tr>
	  <td><p>Estimated Number of Entries</p></td>
	  <td><p>This is the estimated number of entries in groups.</p>
	    <p>If this field is not present, the default value of <code>4</code>
          will be used for the estimated number of group entries.</p>
	    <p>This field is present if bit 1 of <em>Flags</em> is set.</p>
	  </td>
	</tr>

	<tr>
	  <td><p>Estimated Link Name Length of Entries</p></td>
	  <td><p>This is the estimated length of entry name.</p>
	    <p>If this field is not present, the default value of <code>8</code>
          will be used for the estimated link name length of group entries.</p>
	    <p>This field is present if bit 1 of <em>Flags</em> is set.</p>
	  </td>
	</tr>

  </table>
</div>
<!--    </p> -->

<h4><a name="FilterMessage">IV.A.2.l. The Data Storage - Filter
    Pipeline Message</a></h4>

<!-- start msgdesc table -->
<center>
  <table class="msgdesc">
    <tr><td colspan="2"><b>Header Message Name:</b>
        Data Storage - Filter Pipeline</td></tr>
    <tr><td colspan="2"><b>Header Message Type:</b> 0x000B</td></tr>
    <tr><td colspan="2"><b>Length:</b> Varies</td></tr>
    <tr><td colspan="2"><b>Status:</b> Optional; may not be
        repeated.</td></tr>
    <tr><td><b>Description:</b></td>
      <td><p>This message describes the filter pipeline which should
          be applied to the data stream by providing filter identification
          numbers, flags, a name, and client data.</p>
        <p>This message may be present in the object headers of both
          dataset and group objects. For datasets, it specifies the
          filters to apply to raw data. For groups, it specifies the
          filters to apply to the group&rsquo;s fractal heap. Currently,
          only datasets using chunked data storage use the filter
          pipeline on their raw data.</p></td></tr>
    <tr><td colspan="2"><b>Format of Data:</b> See the tables
        below.</td></tr>
</table></center>
<!-- end msgdesc table -->

<div align="center">
  <table class="format">
    <caption>
      Layout: Filter Pipeline Message - Version 1
    </caption>

	<tr>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	</tr>

	<tr>
	  <td>Version</td>
	  <td>Number of Filters</td>
	  <td colspan="2">Reserved (zero)</td>
	</tr>

	<tr>
	  <td colspan="4">Reserved (zero)</td>
	</tr>

	<tr>
	  <td colspan="4"><br />Filter Description List <em>(variable size)</em><br /><br /></td>
	</tr>
  </table>
</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Filter Pipeline Message - Version 1
    </caption>
	<tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
	</tr>

	<tr>
	  <td><p>Version</p></td>
	  <td><p>The version number for this message.  This table
	      describes version 1.</p></td>
	</tr>

	<tr>
	  <td><p>Number of Filters</p></td>
	  <td><p>The total number of filters described in this
	      message. The maximum possible number of filters in a
	      message is 32.</p></td>
	</tr>

	<tr>
	  <td><p>Filter Description List</p></td>
	  <td><p>A description of each filter.  A filter description
	      appears in the next table.</p></td>
	</tr>
  </table>
</div>

<br />
<br />
<br />
<div align="center">
  <table class="format">
    <caption>
      Layout: Filter Description - Version 1
    </caption>

	<tr>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	</tr>

	<tr>
	  <td colspan="2">Filter Identification Value</td>
	  <td colspan="2">Name Length</td>
	</tr>

	<tr>
	  <td colspan="2">Flags</td>
	  <td colspan="2">Number Client Data Values</td>
	</tr>

	<tr>
	  <td colspan="4"><br />Name <em>(variable size, optional)</em><br /><br /></td>
	</tr>

	<tr>
	  <td colspan="4"><br />Client Data <em>(variable size, optional)</em><br /><br /></td>
	</tr>

	<tr>
	  <td colspan="4">Padding <em>(variable size, optional)</em></td>
	</tr>
  </table>
</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Filter Description - Version 1
    </caption>
	<tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
	</tr>

	<tr>
	  <td><p>Filter Identification Value</p></td>
	  <td>
        <p>
          This value, often referred to as a filter identifier,
          is designed to be a unique identifier for the filter.
          Values from zero through 32,767 are reserved for filters
          supported by The HDF Group in the HDF5 Library and for
          filters requested and supported by third parties.
          Filters supported by The HDF Group are documented immediately
          below.  Information on 3rd-party filters can be found at
          The HDF Group&rsquo;s
          <a href="http://www.hdfgroup.org/services/contributions.html">
            Contributions</a> page.</p>

        <p>
          To request a filter identifier, please contact
          The HDF Group&rsquo;s Help Desk at
          <img src="Graphics/help.png" valign="middle" height="14"
               alt="The HDF Group Help Desk">.
          You will be asked to provide the following information:</p>
        <ol>
          <li>Contact information for the developer requesting the
            new identifier</li>
          <li>A short description of the new filter</li>
          <li>Links to any relevant information, including licensing
            information</li>
        </ol>
        <p>
          Values from 32768 to 65535 are reserved for non-distributed uses
          (for example, internal company usage) or for application usage
          when testing a feature. The HDF Group does not track or document
          the use of the filters with identifiers from this range.</p>

        <p>
          The filters currently in library version 1.8.0 are
	      listed below:

	      <table class="list">
	        <tr>
		      <th width="20%" align="center">Identification</th>
		      <th width="15%" align="left">Name</th>
		      <th width="65%" align="left">Description</th>
	        </tr>

	        <tr>
		      <td align="center"><code>0</code></td>
		      <td>N/A</td>
		      <td>Reserved</td>
	        </tr>

	        <tr>
		      <td align="center"><code>1</code></td>
		      <td>deflate</td>
		      <td>GZIP deflate compression</td>
	        </tr>

	        <tr>
		      <td align="center"><code>2</code></td>
		      <td>shuffle</td>
		      <td>Data element shuffling</td>
	        </tr>

	        <tr>
		      <td align="center"><code>3</code></td>
		      <td>fletcher32</td>
		      <td>Fletcher32 checksum</td>
	        </tr>

	        <tr>
		      <td align="center"><code>4</code></td>
		      <td>szip</td>
		      <td>SZIP compression</td>
	        </tr>

	        <tr>
		      <td align="center"><code>5</code></td>
		      <td>nbit</td>
		      <td>N-bit packing</td>
	        </tr>

	        <tr>
		      <td align="center"><code>6</code></td>
		      <td>scaleoffset</td>
		      <td>Scale and offset encoded values</td>
	        </tr>
	      </table>
      </p></td>
	</tr>

	<tr>
	  <td><p>Name Length</p></td>
	  <td><p>Each filter has an optional null-terminated ASCII name
	      and this field holds the length of the name including the
	      null termination padded with nulls to be a multiple of
	      eight. If the filter has no name then a value of zero is
	      stored in this field.</p></td>
	</tr>

	<tr>
	  <td><p>Flags</p></td>
	  <td><p>The flags indicate certain properties for a filter.  The
	      bit values defined so far are:
	      <table class="list">
	        <tr>
		      <th width="20%" align="center">Bit</th>
		      <th width="80%" align="left">Description</th>
	        </tr>

	        <tr>
		      <td align="center"><code>0</code></td>
	          <td>If set then the filter is an optional filter.
		        During output, if an optional filter fails it will be
		        silently skipped in the pipeline.</td>
	        </tr>

	        <tr>
		      <td align="center"><code>1-15</code></td>
	          <td>Reserved (zero)</td>
	        </tr>
	    </table></p>
	  </td>
	</tr>

	<tr>
	  <td><p>Number of Client Data Values</p></td>
	  <td><p>Each filter can store integer values to control
	      how the filter operates.  The number of entries in the
	      <em>Client Data</em> array is stored in this field.</p></td>
	</tr>

	<tr>
	  <td><p>Name</p></td>
	  <td><p>If the <em>Name Length</em> field is non-zero then it will
          contain the size of this field, padded to a multiple of eight. This
          field contains a null-terminated, ASCII character string to serve
          as a comment/name for the filter.</p></td>
	</tr>

	<tr>
	  <td><p>Client Data</p></td>
	  <td><p>This is an array of four-byte integers which will be
	      passed to the filter function.  The <em>Client Data Number</em> of
	      Values determines the number of elements in the array.</p></td>
	</tr>

	<tr>
	  <td><p>Padding</p></td>
	  <td><p>Four bytes of zeroes are added to the message at this
	      point if the Client Data Number of Values field contains
	      an odd number.</p></td>
	</tr>
  </table>
</div>

<br />
<br />
<br />
<div align="center">
  <table class="format">
    <caption>
      Layout: Filter Pipeline Message - Version 2
    </caption>

	<tr>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	</tr>

	<tr>
	  <td>Version</td>
	  <td>Number of Filters</td>
      <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
	</tr>

	<tr>
	  <td colspan="4"><br />Filter Description List <em>(variable size)</em><br /><br /></td>
	</tr>
  </table>
</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Filter Pipeline Message - Version 2
    </caption>
	<tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
	</tr>

	<tr>
	  <td><p>Version</p></td>
	  <td><p>The version number for this message.  This table
	      describes version 2.</p></td>
	</tr>

	<tr>
	  <td><p>Number of Filters</p></td>
	  <td><p>The total number of filters described in this
	      message. The maximum possible number of filters in a
	      message is 32.</p></td>
	</tr>

	<tr>
	  <td><p>Filter Description List</p></td>
	  <td><p>A description of each filter.  A filter description
	      appears in the next table.</p></td>
	</tr>
  </table>
</div>

<br />
<br />
<br />
<div align="center">
  <table class="format">
    <caption>
      Layout: Filter Description - Version 2
    </caption>

	<tr>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	</tr>

	<tr>
	  <td colspan="2">Filter Identification Value</td>
	  <td colspan="2">Name Length <em>(optional)</em></td>
	</tr>

	<tr>
	  <td colspan="2">Flags</td>
	  <td colspan="2">Number Client Data Values</td>
	</tr>

	<tr>
	  <td colspan="4"><br />Name <em>(variable size, optional)</em><br /><br /></td>
	</tr>

	<tr>
	  <td colspan="4"><br />Client Data <em>(variable size, optional)</em><br /><br /></td>
	</tr>
  </table>
</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Filter Description - Version 2
    </caption>
	<tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
	</tr>

	<tr>
	  <td><p>Filter Identification Value</p></td>
	  <td>
        <p>
          This value, often referred to as a filter identifier,
          is designed to be a unique identifier for the filter.
          Values from zero through 32,767 are reserved for filters
          supported by The HDF Group in the HDF5 Library and for
          filters requested and supported by third parties.
          Filters supported by The HDF Group are documented immediately
          below.  Information on 3rd-party filters can be found at
          The HDF Group&rsquo;s
          <a href="http://www.hdfgroup.org/services/contributions.html">
            Contributions</a> page.</p>

        <p>
          To request a filter identifier, please contact
          The HDF Group&rsquo;s Help Desk at
          <img src="Graphics/help.png" valign="middle" height="14"
               alt="The HDF Group Help Desk">.
          You will be asked to provide the following information:</p>
        <ol>
          <li>Contact information for the developer requesting the
            new identifier</li>
          <li>A short description of the new filter</li>
          <li>Links to any relevant information, including licensing
            information</li>
        </ol>
        <p>
          Values from 32768 to 65535 are reserved for non-distributed uses
          (for example, internal company usage) or for application usage
          when testing a feature. The HDF Group does not track or document
          the use of the filters with identifiers from this range.</p>

        <p>
          The filters currently in library version 1.8.0 are
	      listed below:

	      <table class="list">
	        <tr>
		      <th width="20%" align="center">Identification</th>
		      <th width="15%" align="left">Name</th>
		      <th width="65%" align="left">Description</th>
	        </tr>

	        <tr>
		      <td align="center"><code>0</code></td>
		      <td>N/A</td>
		      <td>Reserved</td>
	        </tr>

	        <tr>
		      <td align="center"><code>1</code></td>
		      <td>deflate</td>
		      <td>GZIP deflate compression</td>
	        </tr>

	        <tr>
		      <td align="center"><code>2</code></td>
		      <td>shuffle</td>
		      <td>Data element shuffling</td>
	        </tr>

	        <tr>
		      <td align="center"><code>3</code></td>
		      <td>fletcher32</td>
		      <td>Fletcher32 checksum</td>
	        </tr>

	        <tr>
		      <td align="center"><code>4</code></td>
		      <td>szip</td>
		      <td>SZIP compression</td>
	        </tr>

	        <tr>
		      <td align="center"><code>5</code></td>
		      <td>nbit</td>
		      <td>N-bit packing</td>
	        </tr>

	        <tr>
		      <td align="center"><code>6</code></td>
		      <td>scaleoffset</td>
		      <td>Scale and offset encoded values</td>
	        </tr>
	      </table>
	  </p></td>
	</tr>

	<tr>
	  <td><p>Name Length</p></td>
	  <td><p>Each filter has an optional null-terminated ASCII name
	      and this field holds the length of the name including the
	      null termination padded with nulls to be a multiple of
	      eight. If the filter has no name then a value of zero is
	      stored in this field.</p>
        <p>Filters with IDs less than 256 (in other words, filters
          that are defined in this format documentation) do not store
          the <em>Name Length</em> or <em>Name</em> fields.
        </p>
      </td>
	</tr>

	<tr>
	  <td><p>Flags</p></td>
	  <td><p>The flags indicate certain properties for a filter.  The
	      bit values defined so far are:
	      <table class="list">
	        <tr>
		      <th width="20%" align="center">Bit</th>
		      <th width="80%" align="left">Description</th>
	        </tr>

	        <tr>
		      <td align="center"><code>0</code></td>
	          <td>If set then the filter is an optional filter.
		        During output, if an optional filter fails it will be
		        silently skipped in the pipeline.</td>
	        </tr>

	        <tr>
		      <td align="center"><code>1-15</code></td>
	          <td>Reserved (zero)</td>
	        </tr>
	    </table></p>
	  </td>
	</tr>

	<tr>
	  <td><p>Number of Client Data Values</p></td>
	  <td><p>Each filter can store integer values to control
	      how the filter operates.  The number of entries in the
	      <em>Client Data</em> array is stored in this field.</p></td>
	</tr>

	<tr>
	  <td><p>Name</p></td>
	  <td><p>If the <em>Name Length</em> field is non-zero, then it will
          contain the size of this field, <em>not</em> padded to a multiple
          of eight. This field contains a <em>non-</em>null-terminated,
          ASCII character string to serve as a comment/name for the filter.
        </p>
        <p>Filters that are defined in this format documentation
          such as deflate and shuffle do not store the <em>Name
            Length</em> or <em>Name</em> fields.
        </p>
      </td>
	</tr>

	<tr>
	  <td><p>Client Data</p></td>
	  <td><p>This is an array of four-byte integers which will be
	      passed to the filter function.  The Client Data Number of
	      Values</em> determines the number of elements in the array.</p>
</td>
</tr>
</table>
</div>

<h4><a name="AttributeMessage">IV.A.2.m. The Attribute Message</a></h4>

<!-- start msgdesc table -->
<center>
  <table class="msgdesc">
    <tr><td colspan="2"><b>Header Message Name:</b> Attribute</td></tr>
    <tr><td colspan="2"><b>Header Message Type:</b> 0x000C</td></tr>
    <tr><td colspan="2"><b>Length:</b> Varies</td></tr>
    <tr><td colspan="2"><b>Status:</b> Optional; may be
        repeated.</td></tr>
    <tr><td><b>Description:</b></td>
      <td><p>The <em>Attribute</em> message is used to store objects
          in the HDF5 file which are used as attributes, or
          &ldquo;metadata&rdquo; about the current object. An attribute
          is a small dataset; it has a name, a datatype, a dataspace, and
          raw data. Since attributes are stored in the object header, they
          should be relatively small (in other words, less than 64KB).
          They can be associated with any type of object which has an
          object header (groups, datasets, or committed (named)
          datatypes).</p>
        <p>In 1.8.x versions of the library, attributes can be larger
          than 64KB. See the
          <a href="UG/HDF5_Users_Guide-Responsive%20HTML5/index.html#t=HDF5_Users_Guide%2FAttributes%2FHDF5_Attributes.htm%3Frhtocid%3Dtoc8.2_1%23TOC_8_5_Special_Issuesbc-13">
            &ldquo;Special Issues&rdquo;</a> section of the Attributes chapter
          in the <cite>HDF5 User&rsquo;s Guide</cite> for more information.</p>
        <p>Note: Attributes on an object must have unique names:
          the HDF5 Library currently enforces this by causing the
          creation of an attribute with a duplicate name to fail.
          Attributes on different objects may have the same name,
          however.</p></td></tr>
    <tr><td colspan="2"><b>Format of Data:</b> See the tables
        below.</td></tr>
</table></center>
<!-- end msgdesc table -->

<div align="center">
  <table class="format">
    <caption>
      Layout: Attribute Message (Version 1)
    </caption>

	<tr>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	</tr>

	<tr>
	  <td>Version</td>
	  <td>Reserved (zero)</td>
	  <td colspan="2">Name Size</td>
	</tr>

	<tr>
	  <td colspan="2">Datatype Size</td>
	  <td colspan="2">Dataspace Size</td>
	</tr>

	<tr>
	  <td colspan="4"><br />Name <em>(variable size)</em><br /><br /></td>
	</tr>

	<tr>
	  <td colspan="4"><br />Datatype <em>(variable size)</em><br /><br /></td>
	</tr>

	<tr>
	  <td colspan="4"><br />Dataspace <em>(variable size)</em><br /><br /></td>
	</tr>

	<tr>
	  <td colspan="4"><br />Data <em>(variable size)</em><br /><br /></td>
	</tr>
  </table>
</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Attribute Message (Version 1)
    </caption>
	<tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
	</tr>

	<tr>
	  <td><p>Version</p></td>
	  <td><p>The version number information is used for changes in the format of the
	      attribute message and is described here:
	      <table class="list">
	        <tr>
		      <th width="20%" align="center">Version</th>
		      <th width="80%" align="left">Description</th>
	        </tr>

	        <tr>
		      <td align="center"><code>0</code></td>
		      <td>Never used.</td>
	        </tr>

	        <tr>
		      <td align="center"><code>1</code></td>
		      <td>Used by the library before version 1.6 to encode attribute message.
		        This version does not support shared datatypes.</td>
	        </tr>
	    </table></p>
	  </td>
	</tr>

	<tr>
	  <td><p>Name Size</p></td>
	  <td><p>The length of the attribute name in bytes including the
	      null terminator.  Note that the <em>Name</em> field below may
	      contain additional padding not represented by this
	      field.</p></td>
	</tr>

	<tr>
	  <td><p>Datatype Size</p></td>
	  <td><p>The length of the datatype description in the <em>Datatype</em>
	      field below.  Note that the <em>Datatype</em> field may contain
	      additional padding not represented by this field.</p></td>
	</tr>

	<tr>
	  <td><p>Dataspace Size</p></td>
	  <td><p>The length of the dataspace description in the <em>Dataspace</em>
	      field below.  Note that the <em>Dataspace</em> field may contain
	      additional padding not represented by this field.</p></td>
	</tr>

	<tr>
	  <td><p>Name</p></td>
	  <td><p>The null-terminated attribute name.  This field is
	      padded with additional null characters to make it a
	      multiple of eight bytes.</p></td>
	</tr>

	<tr>
	  <td><p>Datatype</p></td>
	  <td><p>The datatype description follows the same format as
	      described for the datatype object header message.  This
	      field is padded with additional zero bytes to make it a
	      multiple of eight bytes.</p></td>
	</tr>

	<tr>
	  <td><p>Dataspace</p></td>
	  <td><p>The dataspace description follows the same format as
	      described for the dataspace object header message.  This
	      field is padded with additional zero bytes to make it a
	      multiple of eight bytes.</p></td>
	</tr>

	<tr>
	  <td><p>Data</p></td>
	  <td><p>The raw data for the attribute.  The size is determined
	      from the datatype and dataspace descriptions.  This
	      field is <em>not</em> padded with additional bytes.</p></td>
	</tr>
  </table>
</div>

<br />
<br />
<br />
<div align="center">
  <table class="format">
    <caption>
      Layout: Attribute Message (Version 2)
    </caption>

	<tr align="center">
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	</tr>

	<tr>
	  <td>Version</td>
	  <td>Flags</td>
	  <td colspan="2">Name Size</td>
	</tr>

	<tr>
	  <td colspan="2">Datatype Size</td>
	  <td colspan="2">Dataspace Size</td>
	</tr>

	<tr>
	  <td colspan="4"><br />Name <em>(variable size)</em><br /><br /></td>
	</tr>

	<tr>
	  <td colspan="4"><br />Datatype <em>(variable size)</em><br /><br /></td>
	</tr>

	<tr>
	  <td colspan="4"><br />Dataspace <em>(variable size)</em><br /><br /></td>
	</tr>

	<tr>
	  <td colspan="4"><br />Data <em>(variable size)</em><br /><br /></td>
	</tr>
  </table>
</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Attribute Message (Version 2)
    </caption>
	<tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
	</tr>

	<tr>
	  <td><p>Version</p></td>
	  <td><p>The version number information is used for changes in the
          format of the attribute message and is described here:
          <table class="list">
            <tr>
              <th width="20%" align="center">Version</th>
              <th width="80%" align="left">Description</th>
            </tr>

            <tr>
              <td align="center"><code>2</code></td>
              <td>Used by the library of version 1.6.x and after to encode
                attribute messages.
                This version supports shared datatypes.  The fields of
                name, datatype, and dataspace are not padded with
                additional bytes of zero.
              </td>
            </tr>
        </table></p>
	  </td>
	</tr>

	<tr>
	  <td><p>Flags</p></td>
	  <td><p>This bit field contains extra information about
          interpreting the attribute message:

	      <table class="list">
	        <tr>
		      <th width="20%" align="center">Bit</th>
		      <th width="80%" align="left">Description</th>
	        </tr>

	        <tr>
		      <td align="center"><code>0</code></td>
		      <td>If set, datatype is shared.</td>
	        </tr>

	        <tr>
		      <td align="center"><code>1</code></td>
		      <td>If set, dataspace is shared.</td>
	        </tr>
	    </table></p>
	  </td>
	</tr>

	<tr>
	  <td><p>Name Size</p></td>
	  <td><p>The length of the attribute name in bytes including the
	      null terminator.</p></td>
	</tr>

	<tr>
	  <td><p>Datatype Size</p></td>
	  <td><p>The length of the datatype description in the <em>Datatype</em>
	      field below.</p></td>
	</tr>

	<tr>
	  <td><p>Dataspace Size</p></td>
	  <td><p>The length of the dataspace description in the <em>Dataspace</em>
	      field below.</p></td>
	</tr>

	<tr>
	  <td><p>Name</p></td>
	  <td><p>The null-terminated attribute name.  This field is <em>not</em>
	      padded with additional bytes.</p></td>
	</tr>

	<tr>
	  <td><p>Datatype</p></td>
	  <td><p>The datatype description follows the same format as
          described for the datatype object header message.
        </p>
        <p>If the
          <em>Flag</em> field indicates this attribute&rsquo;s datatype is
          shared, this field will contain a &ldquo;shared message&rdquo; encoding
          instead of the datatype encoding.
        </p>
        <p>This field is <em>not</em> padded with additional bytes.
        </p>
      </td>
	</tr>

	<tr>
	  <td><p>Dataspace</p></td>
	  <td><p>The dataspace description follows the same format as
          described for the dataspace object header message.
        </p>
        <p>If the
          <em>Flag</em> field indicates this attribute&rsquo;s dataspace is
          shared, this field will contain a &ldquo;shared message&rdquo; encoding
          instead of the dataspace encoding.
        </p>
        <p>This field is <em>not</em> padded with additional bytes.</p>
      </td>
	</tr>

	<tr>
	  <td><p>Data</p></td>
	  <td><p>The raw data for the attribute.  The size is determined
          from the datatype and dataspace descriptions.
        </p>
        <p>This field is <em>not</em> padded with additional zero bytes.
        </p>
      </td>
	</tr>
  </table>
</div>

<br />
<br />
<br />
<div align="center">
  <table class="format">
    <caption>
      Layout: Attribute Message (Version 3)
    </caption>

	<tr align="center">
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	</tr>

	<tr>
	  <td>Version</td>
	  <td>Flags</td>
	  <td colspan="2">Name Size</td>
	</tr>

	<tr>
	  <td colspan="2">Datatype Size</td>
	  <td colspan="2">Dataspace Size</td>
	</tr>

	<tr>
	  <td>Name Character Set Encoding</td>
      <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
	</tr>

	<tr>
	  <td colspan="4"><br />Name <em>(variable size)</em><br /><br /></td>
	</tr>

	<tr>
	  <td colspan="4"><br />Datatype <em>(variable size)</em><br /><br /></td>
	</tr>

	<tr>
	  <td colspan="4"><br />Dataspace <em>(variable size)</em><br /><br /></td>
	</tr>

	<tr>
	  <td colspan="4"><br />Data <em>(variable size)</em><br /><br /></td>
	</tr>
  </table>
</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Attribute Message (Version 3)
    </caption>
	<tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
	</tr>

	<tr>
	  <td><p>Version</p></td>
	  <td><p>The version number information is used for changes in the
          format of the attribute message and is described here:
          <table class="list">
            <tr>
              <th width="20%" align="center">Version</th>
              <th width="80%" align="left">Description</th>
            </tr>

            <tr>
              <td align="center"><code>3</code></td>
              <td>Used by the library of version 1.8.x and after to
                encode attribute messages.
                This version supports attributes with non-ASCII names.
              </td>
            </tr>
        </table></p>
	  </td>
	</tr>

	<tr>
	  <td><p>Flags</p></td>
	  <td><p>This bit field contains extra information about
          interpreting the attribute message:

	      <table class="list">
	        <tr>
		      <th width="20%" align="center">Bit</th>
		      <th width="80%" align="left">Description</th>
	        </tr>

	        <tr>
		      <td align="center"><code>0</code></td>
		      <td>If set, datatype is shared.</td>
	        </tr>

	        <tr>
		      <td align="center"><code>1</code></td>
		      <td>If set, dataspace is shared.</td>
	        </tr>
	    </table></p>
	  </td>
	</tr>

	<tr>
	  <td><p>Name Size</p></td>
	  <td><p>The length of the attribute name in bytes including the
	      null terminator.</p></td>
	</tr>

	<tr>
	  <td><p>Datatype Size</p></td>
	  <td><p>The length of the datatype description in the <em>Datatype</em>
	      field below.</p></td>
	</tr>

	<tr>
	  <td><p>Dataspace Size</p></td>
	  <td><p>The length of the dataspace description in the <em>Dataspace</em>
	      field below.</p></td>
	</tr>

	<tr>
	  <td><p>Name Character Set Encoding</p></td>
	  <td><p>The character set encoding for the attribute&rsquo;s name:
          <table class="list">
            <tr>
              <th width="20%" align="center">Value</th>
              <th width="80%" align="left">Description</th>
            </tr>

            <tr>
              <td align="center"><code>0</code></td>
              <td>ASCII character set encoding
              </td>
            </tr>

            <tr>
              <td align="center"><code>1</code></td>
              <td>UTF-8 character set encoding
              </td>
            </tr>
          </table>
        </p>
      </td>
	</tr>

	<tr>
	  <td><p>Name</p></td>
	  <td><p>The null-terminated attribute name.  This field is <em>not</em>
	      padded with additional bytes.</p></td>
	</tr>

	<tr>
	  <td><p>Datatype</p></td>
	  <td><p>The datatype description follows the same format as
          described for the datatype object header message.
        </p>
        <p>If the
          <em>Flag</em> field indicates this attribute&rsquo;s datatype is
          shared, this field will contain a &ldquo;shared message&rdquo; encoding
          instead of the datatype encoding.
        </p>
        <p>This field is <em>not</em> padded with additional bytes.
        </p>
      </td>
	</tr>

	<tr>
	  <td><p>Dataspace</p></td>
	  <td><p>The dataspace description follows the same format as
          described for the dataspace object header message.
        </p>
        <p>If the
          <em>Flag</em> field indicates this attribute&rsquo;s dataspace is
          shared, this field will contain a &ldquo;shared message&rdquo; encoding
          instead of the dataspace encoding.
        </p>
        <p>This field is <em>not</em> padded with additional bytes.</p>
      </td>
	</tr>

	<tr>
	  <td><p>Data</p></td>
	  <td><p>The raw data for the attribute.  The size is determined
          from the datatype and dataspace descriptions.
        </p>
        <p>This field is <em>not</em> padded with additional zero bytes.
        </p>
      </td>
	</tr>
  </table>
</div>

<h4><a name="CommentMessage">IV.A.2.n. The Object Comment
    Message</a></h4>

<!-- start msgdesc table -->
<center>
  <table class="msgdesc">
    <tr><td colspan="2"><b>Header Message Name:</b> Object
        Comment</td></tr>
    <tr><td colspan="2"><b>Header Message Type:</b> 0x000D</td></tr>
    <tr><td colspan="2"><b>Length:</b> Varies</td></tr>
    <tr><td colspan="2"><b>Status:</b> Optional; may not be
        repeated.</td></tr>
    <tr><td><b>Description:</b></td>
      <td>The object comment is designed to be a short description of
        an object. An object comment is a sequence of non-zero
        (<code>\0</code>) ASCII characters with no other formatting
        included by the library.</td></tr>
    <tr><td colspan="2"><b>Format of Data:</b> See the tables
        below.</td></tr>
</table></center>
<!-- end msgdesc table -->

<div align="center">
  <table class="format">
    <caption>
      Layout: Object Comment Message
    </caption>

	<tr>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	</tr>

	<tr>
	  <td colspan="4"><br />Comment <em>(variable size)</em><br /><br /></td>
	</tr>
  </table>
</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Object Comment Message
    </caption>
	<tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
	</tr>

	<tr>
	  <td><p>Name</p></td>
	  <td><p>A null terminated ASCII character string.</p></td>
	</tr>
  </table>
</div>

<h4><a name="OldModificationTimeMessage">IV.A.2.o. The Object
    Modification Time (Old) Message</a></h4>

<!-- start msgdesc table -->
<center>
  <table class="msgdesc">
    <tr><td colspan="2"><b>Header Message Name:</b> Object
        Modification Time (Old)</td></tr>
    <tr><td colspan="2"><b>Header Message Type:</b> 0x000E</td></tr>
    <tr><td colspan="2"><b>Length:</b> Fixed</td></tr>
    <tr><td colspan="2"><b>Status:</b> Optional; may not be
        repeated.</td></tr>
    <tr><td><b>Description:</b></td>
      <td><p>The object modification date and time is a timestamp
          which indicates (using ISO-8601 date and time format) the last
          modification of an object. The time is updated when any object
          header message changes according to the system clock where the
          change was posted. All fields of this message should be
          interpreted as coordinated universal time (UTC).</p>
        <p>This modification time message is deprecated in favor of
          the &ldquo;new&rdquo; <a href="#ModificationTimeMessage">Object
            Modification Time</a> message and is no longer written to the
          file in versions of the HDF5 Library after the 1.6.0
          version.</p></td></tr>
    <tr><td colspan="2"><b>Format of Data:</b> See the tables
        below.</td></tr>
</table></center>
<!-- end msgdesc table -->

<div align="center">
  <table class="format">
    <caption>
      Layout: Modification Time Message (Old)
    </caption>

	<tr>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	</tr>

	<tr>
	  <td colspan="4">Year</td>
	</tr>

	<tr>
	  <td colspan="2">Month</td>
	  <td colspan="2">Day of Month</td>
	</tr>

	<tr>
	  <td colspan="2">Hour</td>
	  <td colspan="2">Minute</td>
	</tr>

	<tr>
	  <td colspan="2">Second</td>
	  <td colspan="2">Reserved</td>
	</tr>
  </table>
</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Modification Time Message (Old)
    </caption>
	<tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
	</tr>

	<tr>
	  <td><p>Year</p></td>
	  <td><p>The four-digit year as an ASCII string. For example,
	      <code>1998</code>.
      </p></td>
	</tr>

	<tr>
	  <td><p>Month</p></td>
	  <td><p>The month number as a two digit ASCII string where
	      January is <code>01</code> and December is <code>12</code>.</p></td>
	</tr>

	<tr>
	  <td><p>Day of Month</p></td>
	  <td><p>The day number within the month as a two digit ASCII
	      string. The first day of the month is <code>01</code>.</p></td>
	</tr>

	<tr>
	  <td><p>Hour</p></td>
	  <td><p>The hour of the day as a two digit ASCII string where
	      midnight is <code>00</code> and 11:00pm is <code>23</code>.</p></td>
	</tr>

	<tr>
	  <td><p>Minute</p></td>
	  <td><p>The minute of the hour as a two digit ASCII string where
	      the first minute of the hour is <code>00</code> and
	      the last is <code>59</code>.</p></td>
	</tr>

	<tr>
	  <td><p>Second</p></td>
	  <td><p>The second of the minute as a two digit ASCII string
	      where the first second of the minute is <code>00</code>
	      and the last is <code>59</code>.</p></td>
	</tr>

	<tr>
	  <td><p>Reserved</p></td>
	  <td><p>This field is reserved and should always be zero.</p></td>
	</tr>
  </table>
</div>

<h4><a name="SOHMTableMessage">IV.A.2.p. The Shared Message Table
    Message</a></h4>

<!-- start msgdesc table -->
<center>
  <table class="msgdesc">
    <tr><td colspan="2"><b>Header Message Name:</b> Shared Message
        Table</td></tr>
    <tr><td colspan="2"><b>Header Message Type:</b> 0x000F</td></tr>
    <tr><td colspan="2"><b>Length:</b> Fixed</td></tr>
    <tr><td colspan="2"><b>Status:</b> Optional; may not be
        repeated.</td></tr>
    <tr><td><b>Description:</b></td>
      <td>This message is used to locate the table of shared object
        header message (SOHM) indexes. Each index consists of information
        to find the shared messages from either the heap or object header.
        This message is <em>only</em> found in the superblock
        extension.</td></tr>
    <tr><td colspan="2"><b>Format of Data:</b> See the tables
        below.</td></tr>
</table></center>
<!-- end msgdesc table -->

<div align="center">
  <table class="format">
    <caption>
      Layout: Shared Message Table Message
    </caption>

	<tr>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	</tr>

	<tr>
	  <td>Version</td>
      <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
	</tr>

	<tr>
	  <td colspan="4"><br />Shared Object Header Message Table Address<sup>O</sup><br /><br /></td>
	</tr>

	<tr>
	  <td>Number of Indices</td>
      <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
	</tr>

  </table>

  <table class="note">
    <tr>
    <tr>
      <td width="60%">&nbsp;</td>
      <td width="40%">
        (Items marked with an &lsquo;O&rsquo; in the above table are
        of the size specified in the <a href="#SizeOfOffsetsV0">Size
          of Offsets</a> field in the superblock.)
    </td></tr>
  </table>

</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Shared Message Table Message
    </caption>
	<tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
	</tr>

	<tr>
	  <td><p>Version</p></td>
	  <td><p>The version number for this message.  This document describes version 0.</p></td>
	</tr>

	<tr>
	  <td><p>Shared Object Header Message Table Address</p></td>
	  <td><p>This field is the address of the master table for shared
          object header message indexes.</p>
	  </td>
	</tr>

	<tr>
	  <td><p>Number of Indices</p></td>
	  <td><p>This field is the number of indices in the master table.
      </p></td>
	</tr>

  </table>
</div>

<h4><a name="ContinuationMessage">IV.A.2.q. The Object Header
    Continuation Message</a></h4>

<!-- start msgdesc table -->
<center>
  <table class="msgdesc">
    <tr><td colspan="2"><b>Header Message Name:</b> Object Header
        Continuation</td></tr>
    <tr><td colspan="2"><b>Header Message Type:</b> 0x0010</td></tr>
    <tr><td colspan="2"><b>Length:</b> Fixed</td></tr>
    <tr><td colspan="2"><b>Status:</b> Optional; may be
        repeated.</td></tr>
    <tr><td><b>Description:</b></td>
      <td>The object header continuation is the location in the file
        of a block containing more header messages for the current data
        object. This can be used when header blocks become too large or
        are likely to change over time.</td></tr>
    <tr><td colspan="2"><b>Format of Data:</b> See the tables
        below.</td></tr>
</table></center>
<!-- end msgdesc table -->

<div align="center">
  <table class="format">
    <caption>
      Layout: Object Header Continuation Message
    </caption>

    <tr>
      <th width="25%">byte</th>
      <th width="25%">byte</th>
      <th width="25%">byte</th>
      <th width="25%">byte</th>
    </tr>

    <tr>
      <td colspan="4"><br />Offset<sup>O</sup><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4"><br />Length<sup>L</sup><br /><br /></td>
    </tr>
  </table>

  <table class="note">
    <tr>
      <td width="60%">&nbsp;</td>
      <td width="40%">
        (Items marked with an &lsquo;O&rsquo; in the above table are
        of the size specified in the <a href="#SizeOfOffsetsV0">Size
          of Offsets</a> field in the superblock.)
    </td></tr>
    <tr>
      <td>&nbsp;</td>
      <td>
        (Items marked with an &lsquo;L&rsquo; in the above table are
        of the size specified in the <a href="#SizeOfLengthsV0">Size
          of Lengths</a> field in the superblock.)
    </td></tr>
  </table>

</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Object Header Continuation Message
    </caption>
    <tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
    </tr>

    <tr>
      <td><p>Offset</p></td>
      <td><p>This value is the address in the file where the
          header continuation block is located.</p></td>
    </tr>

    <tr>
      <td><p>Length</p></td>
      <td><p>This value is the length in bytes of the header continuation
          block in the file.</p></td>
    </tr>
  </table>
</div>
<br />

<p>The format of the header continuation block that this message points
  to depends on the version of the object header that the message is
  contained within.
</p>

<p>
  Continuation blocks for version 1 object headers have no special
  formatting information; they are merely a list of object header
  message info sequences (type, size, flags, reserved bytes and data
  for each message sequence).  See the description
  of <a href="#V1ObjectHeaderPrefix">Version 1 Data Object Header Prefix.</a>
</p>

<p>Continuation blocks for version 2 object headers <em>do</em> have
  special formatting information as described here
  (see also the description of
  <a href="#V2ObjectHeaderPrefix">Version 2 Data Object Header Prefix.</a>):
</p>
<div align="center">
  <table class="format">
    <caption>
      Layout: Version 2 Object Header Continuation Block
    </caption>

	<tr>
	  <th>byte</th>
	  <th>byte</th>
	  <th>byte</th>
	  <th>byte</th>
	</tr>

	<tr>
	  <td colspan="4">Signature</td>
	</tr>
	<tr>
	  <td>Header Message Type #1</td>
	  <td colspan="2">Size of Header Message Data #1</td>
	  <td>Header Message #1 Flags</td>
	</tr>

	<tr>
	  <td colspan="2">Header Message #1 Creation Order <em>(optional)</em></td>
      <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
	</tr>

	<tr>
	  <td colspan="4"><br />Header Message Data #1<br /><br /></td>
	</tr>

	<tr>
	  <td colspan="4">.<br />.<br />.<br /></td>
	</tr>

	<tr>
	  <td>Header Message Type #n</td>
	  <td colspan="2">Size of Header Message Data #n</td>
	  <td>Header Message #n Flags</td>
	</tr>

	<tr>
	  <td colspan="2">Header Message #n Creation Order <em>(optional)</em></td>
      <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
	</tr>

	<tr>
	  <td colspan="4"><br />Header Message Data #n<br /><br /></td>
	</tr>

	<tr>
	  <td colspan="4">Gap <em>(optional, variable size)</em></td>
	</tr>

	<tr>
	  <td colspan="4">Checksum</td>
	</tr>
  </table>
</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Version 2 Object Header Continuation Block
    </caption>
	<tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
	</tr>

	<tr>
	  <td><p>Signature</p></td>
	  <td>
        <p>The ASCII character string &ldquo;<code>OCHK</code>&rdquo;
          is used to indicate the beginning of an object header
          continuation block. This gives file consistency checking
          utilities a better chance of reconstructing a damaged file.
        </p>
	  </td>
	</tr>

	<tr>
	  <td><p>Header Message #n Type</p></td>
	  <td>
        <p>Same format as version 1 of the object header, described above.
      </p></td>
	</tr>

	<tr>
	  <td><p>Size of Header Message #n Data</p></td>
	  <td>
        <p>Same format as version 1 of the object header, described above.
      </p></td>
	</tr>

	<tr>
	  <td><p>Header Message #n Flags</p></td>
	  <td>
        <p>Same format as version 1 of the object header, described above.
      </p></td>
    </tr>

	<tr>
	  <td><p>Header Message #n Creation Order</p></td>
	  <td>
        <p>This field stores the order that a message of a given type
          was created in.</p>
	    <p>This field is present if bit 2 of <em>flags</em> is set.</p>
      </td>
    </tr>

	<tr>
	  <td><p>Header Message #n Data</p></td>
	  <td>
        <p>Same format as version 1 of the object header, described above.
      </p></td>
	</tr>

	<tr>
	  <td><p>Gap</p></td>
	  <td>
        <p>A gap in an object header chunk is inferred by the end of the
          messages for the chunk before the beginning of the chunk&rsquo;s
          checksum.  Gaps are always smaller than the size of an
          object header message prefix (message type + message size +
          message flags).</p>
        <p>Gaps are formed when a message (typically an attribute message)
          in an earlier chunk is deleted and a message from a later
          chunk that does not quite fit into the free space is moved
          into the earlier chunk.</p>
      </td>
	</tr>

    <tr>
      <td><p>Checksum</p></td>
      <td>
        <p>This is the checksum for the object header chunk.
        </p>
      </td>
    </tr>
  </table>
</div>

<h4><a name="SymbolTableMessage">IV.A.2.r. The Symbol Table
    Message</a></h4>

<!-- start msgdesc table -->
<center>
  <table class="msgdesc">
    <tr><td colspan="2"><b>Header Message Name:</b> Symbol Table
        Message</td></tr>
    <tr><td colspan="2"><b>Header Message Type:</b> 0x0011</td></tr>
    <tr><td colspan="2"><b>Length:</b> Fixed</td></tr>
    <tr><td colspan="2"><b>Status:</b> Required for
        &ldquo;old style&rdquo; groups; may not be repeated.</td></tr>
    <tr><td><b>Description:</b></td>
      <td>Each &ldquo;old style&rdquo; group has a v1 B-tree and a
        local heap for storing symbol table entries, which are located
        with this message.</td></tr>
    <tr><td colspan="2"><b>Format of data:</b> See the tables
        below.</td></tr>
</table></center>
<!-- end msgdesc table -->

<div align="center">
  <table class="format">
    <caption>
      Layout: Symbol Table Message
    </caption>

    <tr>
      <th width="25%">byte</th>
      <th width="25%">byte</th>
      <th width="25%">byte</th>
      <th width="25%">byte</th>
    </tr>

    <tr>
      <td colspan="4"><br />v1 B-tree Address<sup>O</sup><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4"><br />Local Heap Address<sup>O</sup><br /><br /></td>
    </tr>
  </table>

  <table class="note">
    <tr>
    <tr>
      <td width="60%">&nbsp;</td>
      <td width="40%">
        (Items marked with an &lsquo;O&rsquo; in the above table are
        of the size specified in the <a href="#SizeOfOffsetsV0">Size
          of Offsets</a> field in the superblock.)
    </td></tr>
  </table>

</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Symbol Table Message
    </caption>
    <tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
    </tr>

    <tr>
      <td><p>v1 B-tree Address</p></td>
      <td><p>This value is the address of the v1 B-tree containing the
          symbol table entries for the group.</p></td>
    </tr>

    <tr>
      <td><p>Local Heap Address</p></td>
      <td><p>This value is the address of the local heap containing
          the link names for the symbol table entries for the group.</p></td>
    </tr>
  </table>
</div>

<h4><a name="ModificationTimeMessage">IV.A.2.s. The Object
    Modification Time Message</a></h4>

<!-- start msgdesc table -->
<center>
  <table class="msgdesc">
    <tr><td colspan="2"><b>Header Message Name:</b> Object
        Modification Time</td></tr>
    <tr><td colspan="2"><b>Header Message Type:</b> 0x0012</td></tr>
    <tr><td colspan="2"><b>Length:</b> Fixed</td></tr>
    <tr><td colspan="2"><b>Status:</b> Optional; may not be
        repeated.</td></tr>
    <tr><td><b>Description:</b></td>
      <td>The object modification time is a timestamp which indicates
        the time of the last modification of an object. The time is
        updated when any object header message changes according to
        the system clock where the change was posted.</td></tr>
    <tr><td colspan="2"><b>Format of Data:</b> See the tables
        below.</td></tr>
</table></center>
<!-- end msgdesc table -->

<div align="center">
  <table class="format">
    <caption>
      Layout: Modification Time Message
    </caption>

	<tr>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	</tr>

	<tr>
	  <td>Version</td>
	  <td colspan="3">Reserved <em>(zero)</em></td>
	</tr>

	<tr>
	  <td colspan="4">Seconds After UNIX Epoch</td>
	</tr>
  </table>
</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Modification Time Message
    </caption>
	<tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
	</tr>

	<tr>
	  <td><p>Version</p></td>
	  <td><p>The version number is used for changes in the format of Object Modification Time
	      and is described here:
	      <table class="list">
		    <tr>
		      <th width="20%" align="center">Version</th>
		      <th width="80%" align="left">Description</th>
		    </tr>

		    <tr>
		      <td align="center"><code>0</code></td>
		      <td>Never used.</td>
		    </tr>

		    <tr>
		      <td align="center"><code>1</code></td>
		      <td>Used by Version 1.6.1 and after of the library to encode time.  In
		        this version, the time is the seconds after Epoch.</td>
		    </tr>
	    </table></p>
	  </td>
	</tr>

	<tr>
	  <td><p>Seconds After UNIX Epoch</p></td>
	  <td><p>A 32-bit unsigned integer value that stores the number of
          seconds since 0 hours, 0 minutes, 0 seconds, January 1, 1970,
          Coordinated Universal Time.</p></td>
	</tr>
  </table>
</div>

<h4><a name="BtreeKValuesMessage">IV.A.2.t. The B-tree
    &lsquo;K&rsquo; Values Message</a></h4>

<!-- start msgdesc table -->
<center>
  <table class="msgdesc">
    <tr><td colspan="2"><b>Header Message Name:</b> B-tree
        &lsquo;K&rsquo; Values</td></tr>
    <tr><td colspan="2"><b>Header Message Type:</b> 0x0013</td></tr>
    <tr><td colspan="2"><b>Length:</b> Fixed</td></tr>
    <tr><td colspan="2"><b>Status:</b> Optional; may not be
        repeated.</td></tr>
    <tr><td><b>Description:</b></td>
      <td>This message retrieves non-default &lsquo;K&rsquo; values
        for internal and leaf nodes of a group or indexed storage v1
        B-trees. This message is <em>only</em> found in the superblock
        extension.</td></tr>
    <tr><td colspan="2"><b>Format of Data:</b> See the tables
        below.</td></tr>
</table></center>
<!-- end msgdesc table -->

<div align="center">
  <table class="format">
    <caption>
      Layout: B-tree &lsquo;K&rsquo; Values Message
    </caption>

	<tr>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	</tr>

	<tr>
	  <td>Version</td>
	  <td colspan="2">Indexed Storage Internal Node K</td>
      <td bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
	</tr>

	<tr>
	  <td colspan="2">Group Internal Node K</td>
	  <td colspan="2">Group Leaf Node K</td>
	</tr>
  </table>
</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: B-tree &lsquo;K&rsquo; Values Message
    </caption>
	<tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
	</tr>

	<tr>
	  <td><p>Version</p></td>
	  <td><p>The version number for this message. This document describes
          version 0.</p>
	  </td>
	</tr>

	<tr>
	  <td><p>Indexed Storage Internal Node K</p></td>
	  <td><p>This is the node &lsquo;K&rsquo; value for each internal node of an
          indexed storage v1 B-tree.  See the description of this field
          in version 0 and 1 of the superblock as well the section on
          v1 B-trees.
	    </p>
	  </td>
	</tr>

	<tr>
	  <td><p>Group Internal Node K</p></td>
	  <td><p>This is the node &lsquo;K&rsquo; value for each internal node of a group
          v1 B-tree.  See the description of this field in version 0 and
          1 of the superblock as well as the section on v1 B-trees.
	    </p>
	  </td>
	</tr>

	<tr>
	  <td><p>Group Leaf Node K</p></td>
	  <td><p>This is the node &lsquo;K&rsquo; value for each leaf node of a group v1
          B-tree.  See the description of this field in version 0 and 1
          of the superblock as well as the section on v1 B-trees.
	    </p>
	  </td>
	</tr>

  </table>
</div>

<h4><a name="DrvInfoMessage">IV.A.2.u. The Driver Info
    Message</a></h4>

<!-- start msgdesc table -->
<center>
  <table class="msgdesc">
    <tr><td colspan="2"><b>Header Message Name:</b> Driver
        Info</td></tr>
    <tr><td colspan="2"><b>Header Message Type:</b> 0x0014</td></tr>
    <tr><td colspan="2"><b>Length:</b> Varies</td></tr>
    <tr><td colspan="2"><b>Status:</b> Optional; may not be
        repeated.</td></tr>

    <tr><td>
        <b>Description:</b></td>
      <td>This message contains information needed by the file driver
        to reopen a file. This message is <em>only</em> found in the
        superblock extension: see the <a href="#SuperblockExt">
          &ldquo;Disk Format: Level 0C - Superblock Extension&rdquo;</a>
        section for more information. For more information on the fields
        in the driver info message, see the <a href="#DriverInfo">
          &ldquo;Disk Format: Level 0B - File Driver Info&rdquo;</a>
        section; those who use the multi and family file drivers will
        find this section particularly helpful.</td></tr>
    <tr><td colspan="2"><b>Format of Data:</b> See the tables
        below.</td></tr>
</table></center>
<!-- end msgdesc table -->

<div align="center">
  <table class="format">
    <caption>
      Layout: Driver Info Message
    </caption>

	<tr>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	</tr>

	<tr>
	  <td>Version</td>
      <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
	</tr>
	<tr>
	  <td colspan="4"><br />Driver Identification</td>
	</tr>

	<tr>
	  <td colspan="2">Driver Information Size</td>
      <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
	</tr>

	<tr>
	  <td colspan="4"><br /><br />Driver Information <em>(variable size)</em><br /><br /><br /></td>
	</tr>

  </table>
</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Driver Info Message
    </caption>
	<tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
	</tr>

	<tr>
	  <td><p>Version</p></td>
	  <td><p>The version number for this message. This document describes
          version 0.</p>
	  </td>
	</tr>

	<tr>
	  <td><p>Driver Identification</p></td>
	  <td><p>This is an eight-byte ASCII string without null termination which
          identifies the driver.
	    </p>
	  </td>
	</tr>

	<tr>
	  <td><p>Driver Information Size</p></td>
	  <td><p>The size in bytes of the <em>Driver Information</em> field of this
          message.</p>
	  </td>
	</tr>

	<tr>
	  <td><p>Driver Information</p></td>
	  <td><p>Driver information is stored in a format defined by the file driver.</p>
	  </td>
	</tr>
  </table>
</div>

<h4><a name="AinfoMessage">IV.A.2.v. The Attribute Info
    Message</a></h4>

<!-- start msgdesc table -->
<center>
  <table class="msgdesc">
    <tr><td colspan="2"><b>Header Message Name:</b> Attribute
        Info</td></tr>
    <tr><td colspan="2"><b>Header Message Type:</b> 0x0015</td></tr>
    <tr><td colspan="2"><b>Length:</b> Varies</td></tr>
    <tr><td colspan="2"><b>Status:</b> Optional; may not be
        repeated.</td></tr>
    <tr><td><b>Description:</b></td>
      <td>This message stores information about the attributes on an
        object, such as the maximum creation index for the attributes
        created and the location of the attribute storage when the
        attributes are stored &ldquo;densely&rdquo;.</td></tr>
    <tr><td colspan="2"><b>Format of Data:</b> See the tables
        below.</td></tr>
</table></center>
<!-- end msgdesc table -->

<div align="center">
  <table class="format">
    <caption>
      Layout: Attribute Info Message
    </caption>

	<tr>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	</tr>

	<tr>
	  <td>Version</td>
	  <td>Flags</td>
	  <td colspan="2">Maximum Creation Index <em>(optional)</em></td>
	</tr>
	<tr>
	  <td colspan="4"><br />Fractal Heap Address<sup>O</sup><br /><br /></td>
	</tr>
	<tr>
	  <td colspan="4"><br />Attribute Name v2 B-tree Address<sup>O</sup><br /><br /></td>
	</tr>
	<tr>
	  <td colspan="4"><br />Attribute Creation Order v2 B-tree Address<sup>O</sup> <em>(optional)</em><br /><br /></td>
	</tr>

  </table>

  <table class="note">
    <tr>
      <td width="60%">&nbsp;</td>
      <td width="40%">
        (Items marked with an &lsquo;O&rsquo; in the above table are
        of the size specified in the <a href="#SizeOfOffsetsV0">Size
          of Offsets</a> field in the superblock.)
    </td></tr>
  </table>

</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Attribute Info Message
    </caption>
	<tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
	</tr>

	<tr>
	  <td><p>Version</p></td>
	  <td><p>The version number for this message. This document describes
          version 0.</p>
	  </td>
	</tr>

	<tr>
	  <td><p>Flags</p></td>
	  <td><p>This is the attribute index information flag with the
          following definition:

          <table class="list">
            <tr>
              <th width="20%" align="center">Bit</th>
              <th width="80%" align="left">Description</th>
            </tr>

            <tr>
              <td align="center"><code>0</code></td>
              <td>If set, creation order for attributes is tracked.
              </td>
            </tr>
            <tr>
              <td align="center"><code>1</code></td>
              <td>If set, creation order for attributes is indexed.
              </td>
            </tr>
            <tr>
              <td align="center"><code>2-7</code></td>
              <td>Reserved</td>
            </tr>
	    </table></p>

      </td>
	</tr>

	<tr>
	  <td><p>Maximum Creation Index</p></td>
	  <td><p>The is the maximum creation order index value for the
          attributes on the object.</p>
	    <p>This field is present if bit 0 of <em>Flags</em> is set.</p>
	  </td>
	</tr>

	<tr>
	  <td><p>Fractal Heap Address</p></td>
	  <td><p>This is the address of the fractal heap to store dense
          attributes.
          Each attribute stored in the fractal heap is described by
          the <a href="#AttributeMessage">Attribute Message.</a>
        </p>
	  </td>
	</tr>

	<tr>
	  <td><p>Attribute Name v2 B-tree Address</p></td>
	  <td><p>This is the address of the version 2 B-tree to index the
          names of densely stored attributes.</p>
	  </td>
	</tr>

	<tr>
	  <td><p>Attribute Creation Order v2 B-tree Address</p></td>
	  <td><p>This is the address of the version 2 B-tree to index the
          creation order of densely stored attributes.</p>
	    <p>This field is present if bit 1 of <em>Flags</em> is set.</p>
	  </td>
	</tr>

  </table>
</div>

<h4><a name="RefCountMessage">IV.A.2.w. The Object Reference
    Count Message</a></h4>

<!-- start msgdesc table -->
<center>
  <table class="msgdesc">
    <tr><td colspan="2"><b>Header Message Name:</b> Object Reference
        Count</td></tr>
    <tr><td colspan="2"><b>Header Message Type:</b> 0x0016</td></tr>
    <tr><td colspan="2"><b>Length:</b> Fixed</td></tr>
    <tr><td colspan="2"><b>Status:</b> Optional; may not be
        repeated.</td></tr>
    <tr><td><b>Description:</b></td>
      <td>This message stores the number of hard links (in groups or
        objects) pointing to an object: in other words, its
        <em>reference count</em>.</td></tr>
    <tr><td colspan="2"><b>Format of Data:</b> See the tables
        below.</td></tr>
</table></center>
<!-- end msgdesc table -->

<div align="center">
  <table class="format">
    <caption>
      Layout: Object Reference Count
    </caption>

	<tr>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	</tr>

	<tr>
	  <td>Version</td>
      <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
	</tr>

	<tr>
	  <td colspan="4">Reference count</td>
	</tr>
  </table>
</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Object Reference Count
    </caption>
	<tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
	</tr>

	<tr>
	  <td><p>Version</p></td>
	  <td><p>The version number for this message. This document describes
          version 0.</p>
	  </td>
	</tr>

	<tr>
	  <td><p>Reference Count</p></td>
	  <td><p>The unsigned 32-bit integer is the reference count for the
          object. This message is only present in &ldquo;version 2&rdquo;
          (or later) object headers, and if not present those object
          header versions, the reference count for the object is assumed
          to be 1.</p>
	  </td>
	</tr>

  </table>
</div>

<br />

<h4><a name="FsinfoMessage">IV.A.2.x. The File Space Info
    Message</a></h4>

<center>
  <table class="msgdesc">
    <tr><td colspan="2"><b>Header Message Name:</b> File Space
        Info</td></tr>
    <tr><td colspan="2"><b>Header Message Type:</b> 0x0017</td></tr>
    <tr><td colspan="2"><b>Length:</b> Fixed</td></tr>
    <tr><td colspan="2"><b>Status:</b> Optional; may not be
        repeated.</td></tr>
    <tr><td>
        <b>Description:</b></td>
      <td>This message stores the file space management information
        that the library uses in handling file space
        requests for the file. Version 0 of the message is used for release 1.10.0 only.
        Version 1 of the message is used for release 1.10.1+.
        There is no File Space Info message before release 1.10 as the library does
        not track file space across multiple file opens.
        <p>
          Note that version 0 is deprecated starting release 1.10.1.
          That means when the 1.10.1+ library opens an HDF5 file with a version 0 message,
          the library will decode and map the message to version 1.
          On file close, it will encode the message as a version 1 message.
        <p>
          The library uses the following three mechanisms to manage file space in an HDF5 file:
          <ul>
            <li> Free-space managers
              <br> They track free-space sections of various sizes in the file that are not currently
              allocated.  Each free-space manager corresponds to a file space type.
              There are two main groups of file space types: metadata and raw data.
              Metadata is further divided into five types: superblock, B-tree, global heap,
              local heap, and object header.
              See the description of <a href="#FreeSpaceManager">Free-space
                Manager</a> as well the description of file space allocation types in
              <a href="#AppendixB">Appendix B</a>
            </li>
            <li> Aggregators
              <br> The library manages two aggregators, one for metadata and one for raw data.
              Aggregator is a contiguous block of free-space in the file.
              The size of each aggregator is tunable via public routines
              <code>H5Pset_meta_block_size</code> and <code>H5Pset_small_data_block_size</code> respectively.
            </li>
            <li> Virtual file drivers
              <br> The library's virtual file driver interface dispatches requests for additional
              space to the allocation routine of the file driver associated with the file.
              For example, if the sec2 file driver is being used, its allocation routine will
              increase the size of the file to service the requests.
            </li>
          </ul>
        <p>
          For release 1.10.0, the library derives the following four file space strategies
          based on the mechanisms:
          <ul>
            <li>H5F_FILE_SPACE_ALL
              <ul>
                <li>Mechanisms used: free-space managers, aggregators, and virtual file drivers</li>
                <li>Does not persist free-space across file opens</li>
                <li>This strategy is the library default</li>
              </ul>
            </li>
            <li>H5F_FILE_SPACE_ALL_PERSIST</li>
            <ul>
              <li>Mechanisms used: free-space managers, aggregators, and virtual file drivers</li>
              <li>Persist free-space across file opens</li>
            </ul>
            <li>H5F_FILE_SPACE_AGGR_VFD</li>
            <ul>
              <li>Mechanisms used: aggregators and virtual file drivers</li>
              <li>Does not persist free-space across file opens</li>
            </ul>
            <li>H5F_FILE_SPACE_VFD</li>
            <ul>
              <li>Mechanisms used: virtual file drivers</li>
              <li>Does not persist free-space across file opens</li>
            </ul>
          </ul>
          For release 1.10.1+, the free-space manager mechanism is modified to handle paged aggregation
          which aggregates small metadata and raw data allocations into constant-sized well-aligned pages
          to allow efficient I/O accesses.
          With the support of this feature, the library derives the following four file space strategies:
          <ul>
            <li>H5F_FSPACE_STRATEGY_FSM_AGGR </li>
            <ul>
              <li>Mechanisms used: free-space managers, aggregators, and virtual file drivers</li>
              <li>This strategy is the library default</li>
            </ul>
            <li>H5F_FSPACE_STRATEGY_PAGE</li>
            <ul>
              <li>Mechanisms used: free-space managers with embedded paged aggregation and virtual file drivers</li>
            </ul>
            <li>H5F_FSPACE_STRATEGY_AGGR</li>
            <ul>
              <li>Mechanisms used: aggregators and virtual file drivers</li>
            </ul>
            <li>H5F_FSPACE_STRATEGY_NONE</li>
            <ul>
              <li>Mechanisms used: virtual file drivers</li>
            </ul>
          </ul>
          The default is not persisting free-space across file opens for the above four strategies.
          User can use the public routine <code>H5Pset_file_space_strategy</code> to request
          persisting free-space.
    </td></tr>
    <p>
      <tr><td colspan="2"><b>Format of Data:</b> See the tables
          below.</td></tr>
</table></center>
<p>
  <div align="center">
    <table class="format">
      <caption>
        Layout: File Space Info - Version 0
      </caption>

	  <tr>
	    <th width="25%">byte</th>
	    <th width="25%">byte</th>
	    <th width="25%">byte</th>
	    <th width="25%">byte</th>
	  </tr>

	  <tr>
	    <td>Version</td>
	    <td>Strategy</td>
        <td colspan="2">Threshold<sup>L</sup></td>
	  </tr>
	  <tr>
	    <td colspan="4"><br />Free-space manager address<sup>O</sup> for H5FD_MEM_SUPER<br /><br /></td>
	  </tr>
	  <tr>
	    <td colspan="4"><br />Free-space manager address<sup>0</sup> for H5FD_MEM_BTREE<br /><br /></td>
	  </tr>
	  <tr>
	    <td colspan="4"><br />Free-space manager address<sup>0</sup> for H5FD_MEM_DRAW<br /><br /></td>
	  </tr>
	  <tr>
	    <td colspan="4"><br />Free-space manager address<sup>0</sup> for H5FD_MEM_GHEAP<br /><br /></td>
	  </tr>
	  <tr>
	    <td colspan="4"><br />Free-space manager address<sup>0</sup> for H5FD_MEM_LHEAP<br /><br /></td>
	  </tr>
	  <tr>
	    <td colspan="4"><br />Free-space manager address<sup>0</sup> for H5FD_MEM_OHDR<br /><br /></td>
	  </tr>
    </table>

    <table class="note">
      <tr>
        <td width="60%">&nbsp;</td>
        <td width="40%">
          (Items marked with an &lsquo;O&rsquo; in the above table are
          of the size specified in the <a href="#SizeOfOffsetsV0">Size
            of Offsets</a> field in the superblock.)
      </td></tr>
      <tr>
        <td>&nbsp;</td>
        <td>
          (Items marked with an &lsquo;L&rsquo; in the above table are
          of the size specified in the <a href="#SizeOfLengthsV0">Size
            of Lengths</a> field in the superblock.)
      </td></tr>
    </table>

  </div>

  <br />
  <div align="center">
    <table class="desc">
      <caption>
        Fields: File Space Info
      </caption>
	  <tr>
        <th width="30%">Field Name</th>
        <th>Description</th>
	  </tr>

	  <tr>
	    <td><p>Version</p></td>
	    <td><p>This is version 0 of this message.</p>
	    </td>
	  </tr>

	  <tr>
	    <td><p>Strategy</p></td>
	    <td><p>This is the file space strategy used to manage file space.
		    There are four types:
            <table class="list">
              <tr>
                <th width="20%" align="center">Value</th>
                <th width="80%" align="left">Description</th>
              </tr>

              <tr>
                <td align="center"><code>1</code></td>
                <td>H5F_FILE_SPACE_ALL_PERSIST</td>
              </tr>

              <tr>
                <td align="center"><code>2</code></td>
                <td>H5F_FILE_SPACE_ALL</td>
              </tr>

              <tr>
                <td align="center"><code>3</code></td>
                <td>H5F_FILE_SPACE_AGGR_VFD</td>
              </tr>
              <tr>
                <td align="center"><code>4</code></td>
                <td>H5F_FILE_SPACE_VFD</td>
              </tr>
          </table></p>
	    </td>
	  </tr>

	  <tr>
	    <td><p>Threshold</p></td>
	    <td><p>This is the smallest free-space section size that the
	        free-space manager will track.
	    </td>
	  </tr>
	  <tr>
	    <td><p>Free-space manager addresses</p></td>
	    <td><p>These are the six free-space manager addresses for the
            six file space allocation types:
            <ul>
              <li>H5FD_MEM_SUPER</li>
              <li>H5FD_MEM_BTREE</li>
              <li>H5FD_MEM_DRAW</li>
              <li>H5FD_MEM_GHEAP</li>
              <li>H5FD_MEM_LHEAP</li>
              <li>H5FD_MEM_OHDR</li>
            </ul>
            Note that these six fields exist only if the value for the field
            &ldquo;<em>Strategy</em>&rdquo; is H5F_FILE_SPACE_ALL_PERSIST.
          </p>
	    </td>
	  </tr>

    </table>
  </div>
  <br />

  <div align="center">
    <table class="format">
      <caption>
        Layout: File Space Info - Version 1
      </caption>

	  <tr>
	    <th width="25%">byte</th>
	    <th width="25%">byte</th>
	    <th width="25%">byte</th>
	    <th width="25%">byte</th>
	  </tr>

	  <tr>
	    <td>Version</td>
	    <td>Strategy</td>
        <td>Persisting free-space</td>
        <td colspan="1" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
	  </tr>

	  <tr>
        <td colspan="4">Free-space Section Threshold<sup>L</sup></td>
	  </tr>

      <tr>
        <td colspan="4">File Space Page Size</td>
      </tr>

      <tr>
        <td colspan="2">Page-end Metadata threshold</td>
        <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
      </tr>

      <tr>
        <td colspan="4"><br />EOA<sup>0</sup><br /><br /></td>
      </tr>

	  <tr>
	    <td colspan="4"><br />Address<sup>O</sup> of small-sized free-space manager for H5FD_MEM_SUPER<br /><br /></td>
	  </tr>
	  <tr>
	    <td colspan="4"><br />Address<sup>O</sup> of small-sized free-space manager for H5FD_MEM_BTREE<br /><br /></td>
	  </tr>
	  <tr>
	    <td colspan="4"><br />Address<sup>O</sup> of small-sized free-space manager for H5FM_MEM_DRAW<br /><br /></td>
	  </tr>
	  <tr>
	    <td colspan="4"><br />Address<sup>O</sup> of small-sized free-space manager for H5FD_MEM_GHEAP<br /><br /></td>
	  </tr>
	  <tr>
	    <td colspan="4"><br />Address<sup>O</sup> of small-sized free-space manager for H5FD_MEM_LHEAP<br /><br /></td>
	  </tr>
	  <tr>
	    <td colspan="4"><br />Address<sup>O</sup> of small-sized free-space manager for H5FD_MEM_OHDR<br /><br /></td>
	  </tr>
	  <tr>
	    <td colspan="4"><br />Address<sup>O</sup> of large-sized free-space manager for H5FD_MEM_SUPER<br /><br /></td>
	  </tr>
	  <tr>
	    <td colspan="4"><br />Address<sup>O</sup> of large-sized free-space manager for H5FD_MEM_BTREE<br /><br /></td>
	  </tr>
	  <tr>
	    <td colspan="4"><br />Address<sup>O</sup> of large-sized free-space manager for H5FM_MEM_DRAW<br /><br /></td>
	  </tr>
	  <tr>
	    <td colspan="4"><br />Address<sup>O</sup> of large-sized free-space manager for H5FD_MEM_GHEAP<br /><br /></td>
	  </tr>
	  <tr>
	    <td colspan="4"><br />Address<sup>O</sup> of large-sized free-space manager for H5FD_MEM_LHEAP<br /><br /></td>
	  </tr>
	  <tr>
	    <td colspan="4"><br />Address<sup>O</sup> of large-sized free-space manager for H5FD_MEM_OHDR<br /><br /></td>
	  </tr>
    </table>

    <table class="note">
      <tr>
        <td width="60%">&nbsp;</td>
        <td width="40%">
          (Items marked with an &lsquo;O&rsquo; in the above table are
          of the size specified in the <a href="#SizeOfOffsetsV0">Size
            of Offsets</a> field in the superblock.)
      </td></tr>
      <tr>
        <td>&nbsp;</td>
        <td>
          (Items marked with an &lsquo;L&rsquo; in the above table are
          of the size specified in the <a href="#SizeOfLengthsV0">Size
            of Lengths</a> field in the superblock.)
      </td></tr>
    </table>

  </div>

  <br />
  <div align="center">
    <table class="desc">
      <caption>
        Fields: File Space Info
      </caption>
	  <tr>
        <th width="30%">Field Name</th>
        <th>Description</th>
	  </tr>

	  <tr>
	    <td><p>Version</p></td>
	    <td><p>This is version 1 of this message.</p>
	    </td>
	  </tr>

	  <tr>
	    <td><p>Strategy</p></td>
	    <td><p>This is the file space strategy used to manage file space.
		    There are four types:
            <table class="list">
              <tr>
                <th width="20%" align="center">Value</th>
                <th width="80%" align="left">Description</th>
              </tr>

              <tr>
                <td align="center"><code>0</code></td>
                <td>H5F_FSPACE_STRATEGY_FSM_AGGR</td>
              </tr>

              <tr>
                <td align="center"><code>1</code></td>
                <td>H5F_FSPACE_STRATEGY_PAGE</td>
              </tr>

              <tr>
                <td align="center"><code>2</code></td>
                <td>H5F_FSPACE_STRATEGY_AGGR</td>
              </tr>
              <tr>
                <td align="center"><code>3</code></td>
                <td>H5F_FSPACE_STRATEGY_NONE</td>
              </tr>
          </table></p>
	    </td>
	  </tr>

	  <tr>
	    <td><p>Persisting free-space</p></td>
	    <td><p>True or false in persisting free-space.
	    </td>
	  </tr>

	  <tr>
	    <td><p>Free-space Section Threshold</p></td>
	    <td><p>This is the smallest free-space section size that the
	        free-space manager will track.
	    </td>
	  </tr>

	  <tr>
	    <td><p>File space page size</p></td>
	    <td><p>This is the file space page size, which is used when the paged aggregation feature
	        is enabled.
	    </td>
	  </tr>

	  <tr>
	    <td><p>Page-end metadata threshold</p></td>
	    <td><p>This is the smallest free-space section size at the end of a page that
            the free-space manager will track.  This is used when the paged aggregation feature
	        is enabled.
	    </td>
	  </tr>

	  <tr>
	    <td><p>EOA</p></td>
	    <td><p>The EOA before the allocation of free-space manager header and section info for the
            self-referential free-space managers when persisting free-space.
            <br>
            Note that self-referential free-space managers are managers that involve file space
            allocation for the managers' free-space header and section info.
	    </td>
	  </tr>

	  <tr>
	    <td><p>Addresses of small-sized free-space managers</p></td>
	    <td><p>These are the addresses of the six small-sized free-space managers for
            the six file space allocation types:
          </p>
          <ul>
            <li>H5FD_MEM_SUPER</li>
            <li>H5FD_MEM_BTREE</li>
            <li>H5FD_MEM_DRAW</li>
            <li>H5FD_MEM_GHEAP</li>
            <li>H5FD_MEM_LHEAP</li>
            <li>H5FD_MEM_OHDR</li>
          </ul>
          Note that these six fields exist only if the value for the field
          &ldquo;<em>Persisting free-space</em>&rdquo; is true.
</ul>
</td>
</tr>

<tr>
  <td><p>Addresses of large-sized free-space managers</p></td>
  <td><p>These are the addresses of the six large-sized free-space managers for
      the six file space allocation types:
    </p>
    <ul>
      <li>H5FD_MEM_SUPER</li>
      <li>H5FD_MEM_BTREE</li>
      <li>H5FD_MEM_DRAW</li>
      <li>H5FD_MEM_GHEAP</li>
      <li>H5FD_MEM_LHEAP</li>
      <li>H5FD_MEM_OHDR</li>
    </ul>
    Note that these six fields exist only if the value for the field
    &ldquo;<em>Persisting free-space</em>&rdquo; is true.
</ul>
</td>
</tr>

</table>
</div>

<h3><a name="DataStorage">
    IV.B. Disk Format: Level 2B - Data Object Data Storage</a></h3>

<p>The data for an object is stored separately from its header
  information in the file and may not actually be located in the HDF5 file
  itself if the header indicates that the data is stored externally.  The
  information for each record in the object is stored according to the
  dimensionality of the object (indicated in the dataspace header message).
  Multi-dimensional array data is stored in C order; in other words, the
  &ldquo;last&rdquo; dimension changes fastest.</p>

<p>Data whose elements are composed of atomic datatypes are stored in IEEE
  format, unless they are specifically defined as being stored in a different
  machine format with the architecture-type information from the datatype
  header message.  This means that each architecture will need to [potentially]
  byte-swap data values into the internal representation for that particular
  machine.</p>

<p> Data with a variable-length datatype is stored in the global heap
  of the HDF5 file.  Global heap identifiers are stored in the
  data object storage.</p>

<p>Data whose elements are composed of reference datatypes are stored in
  several different ways depending on the particular reference type involved.
  Object pointers are just stored as the offset of the object header being
  pointed to with the size of the pointer being the same number of bytes as
  offsets in the file.</p>

<p>Dataset region references are stored as a heap-ID which points to
  the following information within the file-heap: an offset of the object
  pointed to, number-type information (same format as header message),
  dimensionality information (same format as header message), sub-set start
  and end information (in other words, a coordinate location for each),
  and field start and end names (in other words, a [pointer to the] string
  indicating the first field included and a [pointer to the] string name
  for the last field).  </p>

<p>Data of a compound datatype is stored as a contiguous stream of the items
  in the structure, with each item formatted according to its datatype.
<p>
  Description of datatypes for variable-length, references and compound classes can be found
  in <a href="#DatatypeMessage">Datatype Message</a>.
<p>
  Information about global heap and heap ID can be found in <a href="#GlobalHeap">Global Heap</a>.
<p>
  For reference datatype,
  see also the encoding description for <a href="#ReferenceEncodeRV">Reference Encoding (Revised) </a> and
  <a href="#ReferenceEncodeDP">Reference Encoding (Backward Compatibility)</a> in Appendix D.
</p>

<h2><a name="AppendixA">
    V. Appendix A: Definitions</a></h2>

<p>Definitions of various terms used in this document are included in
  this section.</p>

<div align="center">
  <table class="glossary">
    <tr>
      <th width="20%">Term</th>
      <th>Definition</th>
    </tr>

    <tr>
      <td>Undefined Address</td>
      <td>The <a name="UndefinedAddress">undefined
          address</a> for a file is a file address with all bits
        set: in other words, <code>0xffff...ff</code>.</td>
	</tr>

	<tr>
	  <td>Unlimited Size</td>
	  <td>The <a name="UnlimitedDim">unlimited size</a>
        for a size is a value with all bits set: in other words,
        <code>0xffff...ff</code>.</td>
	</tr>

  </table>
</div>


<h2><a name="AppendixB">
    VI. Appendix B: File Space Allocation Types</a></h2>

<p>There are six basic types of file space allocation as follows:
</p>
<div align="center">
  <table class="desc">
	<tr>
      <th width="30%">Basic Allocation Type</th>
      <th>Description</th>
	</tr>

	<tr>
	  <td>H5FD_MEM_SUPER</td>
	  <td>File space allocated for <em>Superblock.</em></td>
	</tr>

	<tr>
	  <td>H5FD_MEM_BTREE</td>
	  <td>File space allocated for <em>B-tree.</em></td>
	</tr>

	<tr>
	  <td>H5FD_MEM_DRAW</td>
	  <td>File space allocated for <em>raw data</em>.</td>
	</tr>

	<tr>
	  <td>H5FD_MEM_GHEAP</td>
	  <td>File space allocated for <em>Global Heap.</em></td>
	</tr>

	<tr>
	  <td>H5FD_MEM_LHEAP</td>
	  <td>File space allocated for <em>Local Heap.</em></td>
	</tr>

	<tr>
	  <td>H5FD_MEM_OHDR</td>
	  <td>File space allocated for <em>Object Header.</em></td>
	</tr>
  </table>
</div>

<br />
<p>There are other file space allocation types that are mapped to the
  above six basic types because they are similar in nature.
  The mapping and the corresponding description are listed in the following two tables:
</p>

<div align="center">
  <table class="desc">
	<tr>
      <th width="30%">Basic Allocation Type</th>
      <th>Mapping of Allocation Types to Basic Allocation Types</th>
	</tr>

	<tr>
	  <td>H5FD_MEM_SUPER</td>
	  <td><em>none</em></td>
	</tr>

	<tr>
	  <td>H5FD_MEM_BTREE</td>
	  <td>H5FD_MEM_SOHM_INDEX</td>
	</tr>

	<tr>
	  <td>H5FD_MEM_DRAW</td>
	  <td>H5FD_MEM_FHEAP_HUGE_OBJ</td>
	</tr>

	<tr>
	  <td>H5FD_MEM_GHEAP</td>
	  <td><em>none</em></td>
	</tr>

	<tr>
	  <td>H5FD_MEM_LHEAP</td>
	  <td>H5FD_MEM_FHEAP_DBLOCK, H5FD_MEM_FSPACE_SINFO</td>
	</tr>

	<tr>
	  <td>H5FD_MEM_OHDR</td>
	  <td>H5FD_MEM_FHEAP_HDR, H5FD_MEM_FHEAP_IBLOCK, H5FD_MEM_FSPACE_HDR, H5FD_MEM_SOHM_TABLE</td>
	</tr>
  </table>
</div>

<br />
</p>

<div align="center">
  <table class="desc">
	<tr>
      <th width="30%">Allocation Type</th>
      <th>Description</th>
	</tr>

	<tr>
	  <td>H5FD_MEM_FHEAP_HDR</td>
	  <td>File space allocated for <em>Fractal Heap Header.</em></td>
	</tr>

	<tr>
	  <td>H5FD_MEM_FHEAP_DBLOCK</td>
	  <td>File space allocated for <em>Fractal Heap Direct Blocks.</em></td>
	</tr>

	<tr>
	  <td>H5FD_MEM_FHEAP_IBLOCK</td>
	  <td>File space allocated for <em>Fractal Heap Indirect Blocks.</em></td>
	</tr>

	<tr>
	  <td>H5FD_MEM_FHEAP_HUGE_OBJ</td>
	  <td>File space allocated for huge objects in the fractal heap.</td>
	</tr>

	<tr>
	  <td>H5FD_MEM_FSPACE_HDR</td>
	  <td>File space allocated for <em>Free-space Manager Header.</em></td>
	</tr>

	<tr>
	  <td>H5FD_MEM_FSPACE_SINFO</td>
	  <td>File space allocated for <em>Free-space Section List</em> of the free-space manager.</td>
	</tr>
	<tr>
	  <td>H5FD_MEM_SOHM_TABLE</td>
	  <td>File space allocated for <em>Shared Object Header Message Table.</em></td>
	</tr>
	<tr>
	  <td>H5FD_MEM_SOHM_INDEX</td>
	  <td>File space allocated for <em>Shared Message Record List.</em></td>
	</tr>
  </table>
</div>

<h2><a name="AppendixC"> VII. Appendix C:
    Types of Indexes for Dataset Chunks</a></h2>

<p>For an HDF5 file without the latest format enabled, the library
  uses the <a href="#V1Btrees">Version 1 B-tree</a> to index dataset
  chunks.</p>

<p>For an HDF5 file with the latest format enabled, the library uses
  one of the following five indexing types depending on a chunked
  dataset&rsquo;s dimension specification and the way it is extended.
</p>

<a name="SingleChunk">
  <h3>VII.A. The Single Chunk Index</h3></a>

<p>The <i>Single Chunk</i> index can be used when the dataset fulfills
  the following condition:</p>

<ul>
  <li>the current, maximum, and chunk dimension sizes are all the same</li>
</ul>

<p>The dataset has only one chunk, and the address of the single
  chunk is stored in the version 4 <i>Data Layout</i> message.
  See the <a href="#ChunkedStorage">Chunked Storage Property
    Description</i></a> layout and field description tables.</p>

<a name="Implicit">
  <h3>VII.B. The Implicit Index</h3></a>

<p>The <i>Implicit</i> index can be used when the dataset fulfills
  the following conditions:</p>

<ul>
  <li>fixed maximum dimension sizes</li>
  <li>no filter applied to the dataset</li>
  <li>the timing for the space allocation of the dataset chunks is
    <code>H5P_ALLOC_TIME_EARLY</code></li>
</ul>

<p>Since the dataset&rsquo;s dimension sizes are known and storage space
  is to be allocated early, an array of dataset chunks are allocated
  based on the maximum dimension sizes when the dataset is created.
  The base address of the array is stored in the version 4
  <i>Data Layout</i> message. See the
  <a href="#ChunkedStorage">Chunked Storage Property
    Description</i></a> layout and field description tables.
</p>

<p>When accessing a dataset chunk with a specified offset, the
  address of the chunk in the array is computed as below:</p>

<dir><p><code>base address + (size of a chunk in bytes * chunk index
      associated with the offset)</code></p></dir>

<p>A chunk index starts at 0 and increases according to the
  fastest changing dimension, then the next fastest, and so on.
  <a name="ChunkIndex"></a>
  The chunk index for a dataset chunk offset is computed as below:
  <ol>
    <li>Calculate the scaled offset for each dimension in
      <code>scaled_offset</code>:
      <br />
	  <pre>
        scaled_offset = chunk_offset/chunk_dims
    </pre></li>
    <li>Calculate the # of chunks for each dimension in
      <code>nchunks</code>:
      <br />
	  <pre>
        nchunks = (curr_dims + chunk_dims - 1)/chunk_dims
    </pre></li>

    <li>Calculate the down chunks for each dimension in
      <code>down_chunks</code>:
      <br />
      <pre>
        /* n is the # of dimensions */
        for(i = (int)(n-1), acc = 1; i >= 0; i--) {
        down_chunks[i] = acc;
        acc *= nchunks[i];
        }
      </pre>
    </li>

    <li>Calculate the chunk index in <code>chunk_index</code>:
      <br />
      <pre>
        /* n is the # of dimensions */
        for(u = 0, chunk_index = 0; u < n; u++)
                                        chunk_index += down_chunks[u] * scaled_offset[u];
                                        </pre>
    </li>
  </ol>
<p>
  For example, for a 2-dimensional dataset with
  <code>curr_dims[4,5]</code> and <code>chunk_dims[3,2]</code>,
  there will be a total of 6 chunks, with 3 chunks in the fastest
  changing dimension and 2 chunks in the slowest changing dimension.
  See the figure below.
  The chunk index for the chunk offset <code>[3,4]</code>
  is computed as below:
  <ol>
    <code>
      <li>scaled_offset[0] = 1, scaled_offset[1] = 2</li>
      <li>nchunks[0] = 2, nchunks[1] = 3</li>
      <li>down_chunks[0] = 3, down_chunks[1] = 1</li>
      <li>chunk_index = 5</li>
    </code>
  </ol>


  <table align="center" width="400" border="0">
    <tr valign="center" align="center">
      <td>
        <hr size="2"/>
        <img height="250" src="FileFormatSpecChunkDiagram.jpg"
             alt="Chunk Diagram"></td>
    </tr>
    <tr valign="top" align="center">
      <td>
        <hr size="1" />
        <b>Figure 3. Implicit index chunk diagram </b>
        <hr size="2"/></td>
    </tr>
  </table>





  <a name="FixedArray">
    <h3>VII.C. The Fixed Array Index</h3></a>

<p>The <i>Fixed Array</i> index can be used when the dataset fulfills
  the following condition:</p>
<ul>
  <li>fixed maximum dimension sizes</li>
</ul>

<p>Since the maximum number of chunks is known, an array of
  in-file-on-disk addresses based on the maximum number of chunks is
  allocated when data is written to the dataset. To access a dataset
  chunk with a specified offset, the
  <a href="#ChunkIndex">chunk index</i></a> associated with the offset
is calculated. The index is mapped into the array to locate the
disk address for the chunk.</p>

<p>The Fixed Array (FA) index structure provides space and speed
  improvements in locating chunks over index structures that handle
  more dynamic data accesses like a
  <a href="#AppendV2Btrees">Version 2 B-tree</a> index.
  The entry into the Fixed Array is the Fixed Array header which
  contains metadata about the entries stored in the array. The
  header contains a pointer to a data block which stores the array
  of entries that describe the dataset chunks. For greater efficiency,
  the array will be divided into multiple pages if the number of
  entries exceeds a threshold value. The space for the data block
  and possibly data block pages are allocated as a single contiguous
  block of space.</p>

<p>The content of the data block depends on whether paging is
  activated or not. When paging is not used, elements that describe
  the chunks are stored in the data block. If paging is turned on,
  the data block contains a bitmap indicating which pages are
  initialized. Then subsequent data block pages will contain the
  entries that describe the chunks.</p>

<p>An entry describes either a filtered or non-filtered dataset
  chunk.  The formats for both element types are described below.
</p>
<br />
<div align="center">
  <table class="format">
    <caption>
      Layout: Fixed Array Header
    </caption>

    <tr>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
    </tr>

    <tr>
      <td colspan="4">Signature</td>
    </tr>

    <tr>
      <td>Version</td>
      <td>Client ID</td>
      <td>Entry Size</td>
      <td>Page Bits</td>
    </tr>

    <tr>
      <td colspan="4"><br />Max Num
        Entries<sup>L</sup><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4"><br />Data Block
        Address<sup>O</sup><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4">Checksum</td>
    </tr>

  </table>

  <table class="note">
    <tr>
      <td width="60%">&nbsp;</td>
      <td width="40%">
        (Items marked with an &lsquo;L&rsquo; in the above table are
        of the size specified in the <a href="#SizeOfLengthsV0">Size
          of Lengths</a> field in the superblock.)
    </td></tr>
    <tr>
      <td>&nbsp;</td>
      <td>
        (Items marked with an &lsquo;O&rsquo; in the above table are
        of the size specified in the <a href="#SizeOfOffsetsV0">Size
          of Offsets</a> field in the superblock.)
    </td></tr>
  </table>

</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Fixed Array Header
    </caption>
	<tr>
      <th width="40%">Field Name</th>
      <th>Description</th>
    </tr>

    <tr>
      <td><p>Signature</p></td>
      <td>
        <p>The ASCII character string &ldquo;<code>FAHD</code>&rdquo;
          is used to indicate the beginning of a Fixed Array header.
          This gives file consistency checking utilities a better
          chance of reconstructing a damaged file.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Version</p></td>
      <td>
        <p>This document describes version 0.</p>
      </td>
    </tr>

	<tr>
      <td><p>Client ID</p></td>
      <td>
        <p>The ID for identifying the client of the
          Fixed Array:

          <table class="list">
            <tr>
              <th width="20%" align="center">ID</th>
              <th width="80%" align="left">Description</th>
            </tr>

            <tr>
              <td align="center"><code>0</code></td>
              <td>Non-filtered dataset chunks
              </td>
            </tr>
            <tr>
              <td align="center"><code>1</code></td>
              <td>Filtered dataset chunks
              </td>
            </tr>
            <tr>
              <td align="center"><code>2+</code></td>
              <td>Reserved
              </td>
            </tr>
          </table>
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Entry Size</p></td>
	  <td>
	    <p>The size in bytes of an entry in the Fixed Array.
        </p>
	  </td>
    </tr>

	<tr>
	  <td><p>Page Bits</p></td>
	  <td>
        <p>The number of bits needed to store the maximum
          number of entries in a
          <a href="#FADataBlockPage">data block page.</a></p>
      </td>
	</tr>

	<tr>
	  <td><p>Max Num Entries</p></td>
	  <td>
	    <p>The maximum number of entries in the Fixed
          Array.</p>
	  </td>
	</tr>

	<tr>
	  <td><p>Data Block Address</p></td>
	  <td>
	    <p>The address of the data block in the Fixed Array.
	    </p>
	  </td>

    <tr>
      <td><p>Checksum</p></td>
      <td>
        <p>The checksum for the header.</p>
      </td>
    </tr>

  </table>
</div>

<br />
<br />
<br />
<div align="center">
  <table class="format">
    <caption>
      Layout: Fixed Array Data Block
    </caption>

    <tr>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
    </tr>

    <tr>
      <td colspan="4">Signature</td>
    </tr>

    <tr>
      <td>Version</td>
      <td>Client ID</td>
      <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
          only to align table nicely</em></td>
    </tr>

    <tr>
      <td colspan="4"><br />Header Address<sup>O</sup><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4"><br />Page Bitmap <em>(variable size and
          optional)</em><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4"><br />Elements <em>(variable size and
          optional)</em><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4">Checksum</td>
    </tr>

  </table>

  <table class="note">
    <tr>
      <td width="60%">&nbsp;</td>
      <td width="40%">
        (Items marked with an &lsquo;O&rsquo; in the above table are
        of the size specified in the <a href="#SizeOfOffsetsV0">Size
          of Offsets</a> field in the superblock.)
    </td></tr>
  </table>

</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Fixed Array Data Block
    </caption>
	<tr>
      <th width="40%">Field Name</th>
      <th>Description</th>
    </tr>

    <tr>
      <td><p>Signature</p></td>
      <td>
        <p>The ASCII character string &ldquo;<code>FADB</code>&rdquo;
          is used to indicate the beginning of a Fixed Array data
          block. This gives file consistency checking utilities a
          better chance of reconstructing a damaged file.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Version</p></td>
      <td>
        <p>This document describes version 0.</p>
      </td>
    </tr>

	<tr>
      <td><p>Client ID</p></td>
      <td>
        <p>The ID for identifying the client of the
          Fixed Array:

          <table class="list">
            <tr>
              <th width="20%" align="center">ID</th>
              <th width="80%" align="left">Description</th>
            </tr>

            <tr>
              <td align="center"><code>0</code></td>
              <td>Non-filtered dataset chunks
              </td>
            </tr>
            <tr>
              <td align="center"><code>1</code></td>
              <td>Filtered dataset chunks
              </td>
            </tr>
            <tr>
              <td align="center"><code>2+</code></td>
              <td>Reserved.
              </td>
            </tr>
          </table>
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Header Address</p></td>
	  <td>
	    <p>The address of the Fixed Array header. Principally used
          for file integrity checking.
        </p>
	  </td>
    </tr>

	<tr>
	  <td><p>Page Bitmap</p></td>
	  <td><p>A bitmap indicating which data block pages are initialized.</p>
	    <p>Exists only if the data block is paged.</p></td>
	</tr>

	<tr>
	  <td><p>Elements</p></td>
	  <td>
	    <p>Contains the elements stored in the data block
          and exists only if the data block is not paged.
	      There are two element types:
          <table class="list">
            <tr>
              <th width="20%" align="center">ID</th>
              <th width="80%" align="left">Description</th>
            </tr>

            <tr>
              <td align="center"><code>0</code></td>
              <td><a href="#FaNonFilterChunk">Non-filtered
                  dataset chunks</i></a>
</td>
</tr>
<tr>
  <td align="center"><code>1</code></td>
  <td><a href="#FaFilterChunk">Filtered dataset
      chunks</i></a>
</td>
</tr>
</table>
</p>
</td>
</tr>

<tr>
  <td><p>Checksum</p></td>
  <td>
    <p>The checksum for the Fixed Array data block.</p>
  </td>
</tr>

</table>
</div>

<br />
<br />
<br />
<div align="center">
  <table class="format">
    <caption><a name="FADataBlockPage">
        Layout: Fixed Array Data Block Page</a>
    </caption>

    <tr>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
    </tr>

    <tr>
      <td colspan="4"><br />Elements <em>(variable
          size)</em><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4">Checksum</td>
    </tr>

  </table>
</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Fixed Array Data Block Page
    </caption>
	<tr>
      <th width="40%">Field Name</th>
      <th>Description</th>
    </tr>

	<tr>
	  <td><p>Elements</p></td>
	  <td>
	    <p>Contains the elements stored in the data block page.
	      There are two element types:
          <table class="list">
            <tr>
              <th width="20%" align="center">ID</th>
              <th width="80%" align="left">Description</th>
            </tr>

            <tr>
              <td align="center"><code>0</code></td>
              <td><a href="#FaNonFilterChunk">Non-filtered dataset chunks</i></a>
</td>
</tr>
<tr>
  <td align="center"><code>1</code></td>
  <td><a href="#FaFilterChunk">Filtered dataset chunks</i></a>
</td>
</tr>
</table>
</p>
</td>
</tr>

<tr>
  <td><p>Checksum</p></td>
  <td>
    <p>The checksum for a Fixed Array data block page.</p>
  </td>
</tr>

</table>
</div>

<br />
<br />
<br />
<a name="FaNonFilterChunk"></a>
<div align="center">
  <table class="format">
    <caption>
      Layout: Data Block Element for Non-filtered Dataset Chunk
    </caption>

	<tr>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	</tr>

	<tr>
	  <td colspan="4"><br />Address<sup>O</sup><br /><br /></td>
	</tr>

  </table>

  <table class="note">
    <tr>
      <td width="60%">&nbsp;</td>
      <td width="40%">
        (Items marked with an &lsquo;O&rsquo; in the above table are
        of the size specified in the <a href="#SizeOfOffsetsV0">Size
          of Offsets</a> field in the superblock.)
    </td></tr>
  </table>
</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Data Block Element for Non-filtered Dataset Chunk
    </caption>
	<tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
	</tr>

	<tr>
	  <td><p>Address</p></td>
	  <td><p>The address of the dataset chunk in the file.
        </p>
      </td>
	</tr>

  </table>
</div>
<!--    </p> -->

<br />
<br />
<br />
<a name="FaFilterChunk"></a>
<div align="center">
  <table class="format">
    <caption>
      Layout: Data Block Element for Filtered Dataset Chunk
    </caption>

	<tr>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	</tr>

	<tr>
	  <td colspan="4"><br />Address<sup>O</sup><br /><br /></td>
	</tr>

	<tr>
	  <td colspan="4"><br />Chunk Size <em>(variable size; at most
          8 bytes)</em><br /><br /></td>
	</tr>

	<tr>
	  <td colspan="4">Filter Mask</td>
	</tr>

  </table>

  <table class="note">
    <tr>
      <td width="60%">&nbsp;</td>
      <td width="40%">
        (Items marked with an &lsquo;O&rsquo; in the above table are
        of the size specified in the <a href="#SizeOfOffsetsV0">Size
          of Offsets</a> field in the superblock.)
    </td></tr>
  </table>
</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Data Block Element for Filtered Dataset Chunk
    </caption>
	<tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
	</tr>

	<tr>
	  <td><p>Address</p></td>
	  <td><p>The address of the dataset chunk in the file.
        </p>
      </td>
	</tr>

	<tr>
	  <td><p>Chunk Size</p></td>
	  <td><p>The size of the dataset chunk in bytes.
        </p>
      </td>
	</tr>

	<tr>
	  <td><p>Filter Mask</p></td>
	  <td><p>Indicates the filter to skip for the dataset chunk. Each
          filter has an index number in the pipeline; if that filter is
          skipped, the bit corresponding to its index is set.
        </p>
      </td>
	</tr>

  </table>
</div>

<a name="ExtensibleArray">
  <h3>VII.D. The Extensible Array Index</h3></a>

<p>The <i>Extensible Array</i> index can be used when the dataset
  fulfills the following condition:</p>

<ul>
  <li>only one dimension of unlimited extent</li>
</ul>

<p>The Extensible Array (EA) is a data structure that is used as a
  chunk index in datasets where the dataspace has a single
  unlimited dimension. In other words, one dimension is set to
  <code>H5S_UNLIMITED</code>, and the other dimensions are any number
  of fixed-size dimensions. The idea behind the extensible array is
  that a particular data object can be located via a lightweight
  indexing structure of fixed depth for a given address space. This
  indexing structure requires only a few (2-3) file operations per
  element lookup and gives good cache performance. Unlike the B-tree
  structure, the extensible array is optimized for appends. Where a
  B-tree would always add at the rightmost node under these
  circumstances, either creating a deep tree (version 1) or requiring
  expensive rebalances to correct (version 2), the extensible array
  has already mapped out a pre-balanced internal structure. This
  optimized internal structure is instantiated as needed when chunk
  records are inserted into the structure.</p>



<!--

     <p>A description of the rationale that leads to the present
       implementation of the extensible array can be found at
       <a href="https://svn.hdfgroup.org/hdf5doc/trunk/projects/1_10_alpha/ReviseChunks/skip_lists">
         https://svn.hdfgroup.org/hdf5doc/trunk/projects/1_10_alpha/ReviseChunks/skip_lists</a>.
     </p>

<p>The current implementation differs from the data structure
  described in that reference in some ways, but the basic idea is the
  same.</p>

-->



<p>An Extensible Array consists of a header, an index block,
  secondary blocks, data blocks, and (optional) data block pages. The
  general scheme is that the index block is used to reference a
  secondary block, which is, in turn, used to reference the data block
  page where the chunk information is stored. The data blocks will
  be paged for efficiency when their size passes a threshold value.
  These pages are laid out contiguously on the disk after the data
  block, are initialized as needed, and are tracked via bitmaps
  stored in the secondary block. The number of secondary and data
  blocks/pages in a chunk index varies as they are allocated as
  needed and the first few are (conceptually) stored in parent
  elements as an optimization.</p>

<div align="center">
  <table class="format">
    <caption>
      Layout: Extensible Array Header
    </caption>

    <tr>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
    </tr>

    <tr>
      <td colspan="4">Signature</td>
    </tr>

    <tr>
      <td>Version</td>
      <td>Client ID</td>
      <td>Element Size</td>
      <td>Max Nelmts Bits</td>
	</tr>

	<tr>
      <td>Index Blk Elmts</td>
      <td>Data Blk Min Elmts</td>
      <td>Secondary Blk Min Data Ptrs</td>
      <td>Max Data Blk Page Nelmts Bits</td>
    </tr>

    <tr>
      <td colspan="4"><br />Num Secondary Blks<sup>L</sup><br /><br /></td>
    </tr>
    <tr>
      <td colspan="4"><br />Secondary Blk Size<sup>L</sup><br /><br /></td>
    </tr>
    <tr>
      <td colspan="4"><br />Num Data Blks<sup>L</sup><br /><br /></td>
    </tr>
    <tr>
      <td colspan="4"><br />Data Blk Size<sup>L</sup><br /><br /></td>
    </tr>
    <tr>
      <td colspan="4"><br />Max Index Set<sup>L</sup><br /><br /></td>
    </tr>
    <tr>
      <td colspan="4"><br />Num Elements<sup>L</sup><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4"><br />Index Block Address<sup>O</sup><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4">Checksum</td>
    </tr>

  </table>

  <table class="note">
    <tr>
      <td width="60%">&nbsp;</td>
      <td width="40%">
        (Items marked with an &lsquo;L&rsquo; in the above table are
        of the size specified in the <a href="#SizeOfLengthsV0">Size
          of Lengths</a> field in the superblock.)
    </td></tr>
    <tr>
      <td>&nbsp;</td>
      <td>
        (Items marked with an &lsquo;O&rsquo; in the above table are
        of the size specified in the <a href="#SizeOfOffsetsV0">Size
          of Offsets</a> field in the superblock.)
    </td></tr>
  </table>

</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Extensible Array Header
    </caption>
	<tr>
      <th width="40%">Field Name</th>
      <th>Description</th>
    </tr>

    <tr>
      <td><p>Signature</p></td>
      <td>
        <p>The ASCII character string &ldquo;<code>EAHD</code>&rdquo;
          is used to indicate the beginning of an Extensible Array
          header. This gives file consistency checking utilities a
          better chance of reconstructing a damaged file.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Version</p></td>
      <td>
        <p>This document describes version 0.</p>
      </td>
    </tr>

	<tr>
      <td><p>Client ID</p></td>
      <td>
        <p>The ID for identifying the client of the
          Fixed Array:

          <table class="list">
            <tr>
              <th width="20%" align="center">ID</th>
              <th width="80%" align="left">Description</th>
            </tr>

            <tr>
              <td align="center"><code>0</code></td>
              <td>Non-filtered dataset chunks
              </td>
            </tr>
            <tr>
              <td align="center"><code>1</code></td>
              <td>Filtered dataset chunks
              </td>
            </tr>
            <tr>
              <td align="center"><code>2+</code></td>
              <td>Reserved.
              </td>
            </tr>
          </table>
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Element Size</p></td>
	  <td>
	    <p>The size in bytes of an element in the Extensible Array.
        </p>
	  </td>
    </tr>

	<tr>
	  <td><p>Max Nelmts Bits</p></td>
	  <td>
        <p>The number of bits needed to store the
          maximum number of elements in the Extensible Array.</p>
      </td>
	</tr>

	<tr>
	  <td><p>Index Blk Elmts</p></td>
	  <td>
	    <p>The number of elements to store in the index block.
	    </p>
	  </td>
	</tr>

	<tr>
	  <td><p>Data Blk Min Elmts</p></td>
	  <td>
	    <p>The minimum number of elements per data block.
	    </p>
	  </td>
	</tr>

	<tr>
	  <td><p>Secondary Blk Min Data Ptrs</p></td>
	  <td>
	    <p>The minimum number of data block pointers for a
	      secondary block.
	    </p>
	  </td>
	</tr>

	<tr>
	  <td><p>Max Dblk Page Nelmts Bits</p></td>
	  <td>
	    <p>The number of bits needed to store the maximum number
	      of elements in a data block page.
	    </p>
	  </td>
	</tr>

	<tr>
	  <td><p>Num Secondary Blks</p></td>
	  <td>
	    <p>The number of secondary blocks created.
	    </p>
	  </td>
	</tr>

	<tr>
	  <td><p>Secondary Blk Size</p></td>
	  <td>
	    <p>The size of the secondary blocks created.
	    </p>
	  </td>
	</tr>

	<tr>
	  <td><p>Num Data Blks</p></td>
	  <td>
	    <p>The number of data blocks created.
	    </p>
	  </td>
	</tr>

	<tr>
	  <td><p>Data Blk Size</p></td>
	  <td>
	    <p>The size of the data blocks created.
	    </p>
	  </td>
	</tr>

	<tr>
	  <td><p>Max Index Set</p></td>
	  <td>
	    <p>The maximum index set.
	    </p>
	  </td>
	</tr>

	<tr>
	  <td><p>Num Elmts</p></td>
	  <td>
	    <p>The number of elements realized.
	    </p>
	  </td>
	</tr>

	<tr>
	  <td><p>Index Block Address</p></td>
	  <td>
	    <p>The address of the index block.
	    </p>
	  </td>
	</tr>

    <tr>
      <td><p>Checksum</p></td>
      <td>
        <p>The checksum for the header.</p>
      </td>
    </tr>

  </table>
</div>

<br />
<br />
<br />
<div align="center">
  <table class="format">
    <caption>
      Layout: Extensible Array Index Block
    </caption>

    <tr>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
    </tr>

    <tr>
      <td colspan="4">Signature</td>
    </tr>

    <tr>
      <td>Version</td>
      <td>Client ID</td>
      <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
          only to align table nicely</em></td>
    </tr>

    <tr>
      <td colspan="4"><br />Header Address<sup>O</sup><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4"><br />Elements <em>(variable size and
          optional)</em><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4"><br />Data Block Addresses <em>(variable
          size and optional)</em><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4"><br />Secondary Block Addresses <em>(variable
          size and optional)</em><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4">Checksum</td>
    </tr>

  </table>

  <table class="note">
    <tr>
      <td width="60%">&nbsp;</td>
      <td width="40%">
        (Items marked with an &lsquo;O&rsquo; in the above table are
        of the size specified in the <a href="#SizeOfOffsetsV0">Size
          of Offsets</a> field in the superblock.)
    </td></tr>
  </table>

</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Extensible Array Index Block
    </caption>
	<tr>
      <th width="40%">Field Name</th>
      <th>Description</th>
    </tr>

    <tr>
      <td><p>Signature</p></td>
      <td>
        <p>The ASCII character string &ldquo;<code>EAIB</code>&rdquo;
          is used to indicate the beginning of an Extensible Array
          Index Block. This gives file consistency checking utilities
          a better chance of reconstructing a damaged file.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Version</p></td>
      <td>
        <p>This document describes version 0.</p>
      </td>
    </tr>

	<tr>
      <td><p>Client ID</p></td>
      <td>
        <p>The client ID for identifying the user of the
          Extensible Array:

          <table class="list">
            <tr>
              <th width="20%" align="center">ID</th>
              <th width="80%" align="left">Description</th>
            </tr>

            <tr>
              <td align="center"><code>0</code></td>
              <td>Non-filtered dataset chunks
              </td>
            </tr>
            <tr>
              <td align="center"><code>1</code></td>
              <td>Filtered dataset chunks
              </td>
            </tr>
            <tr>
              <td align="center"><code>2+</code></td>
              <td>Reserved.
              </td>
            </tr>
          </table>
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Header Address</p></td>
	  <td>
	    <p>The address of the Extensible Array header. Principally
          used for file integrity checking.</p>
	  </td>
    </tr>

	<tr>
	  <td><p>Elements</p></td>
	  <td>
	    <p>Contains the elements that are stored directly in
          the index block. An optimization to avoid unnecessary
          secondary blocks.
          <br />
          <br />
          There are two element types:
          <table class="list">
            <tr>
              <th width="20%" align="center">ID</th>
              <th width="80%" align="left">Description</th>
            </tr>

            <tr>
              <td align="center"><code>0</code></td>
              <td><a href="#EaNonFilterChunk">Non-filtered dataset chunks</i></a>
</td>
</tr>
<tr>
  <td align="center"><code>1</code></td>
  <td><a href="#EaFilterChunk">Filtered dataset chunks</i></a>
</td>
</tr>
</table>
</p>
</td>
</tr>

<tr>
  <td><p>Data Block Addresses</p></td>
  <td>
    <p>Contains the addresses of the data blocks
      that are stored directly in the Index Block. An
      optimization to avoid unnecessary secondary blocks.</p>
  </td>
</tr>

<tr>
  <td><p>Secondary Block Addresses</p></td>
  <td>
    <p>Contains the addresses of the secondary
      blocks.</p>
  </td>
</tr>

<tr>
  <td><p>Checksum</p></td>
  <td>
    <p>The checksum for the Extensible Array Index Block.</p>
  </td>
</tr>

</table>
</div>

<br />
<br />
<br />
<div align="center">
  <table class="format">
    <caption>
      Layout: Extensible Array Secondary Block
    </caption>

    <tr>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
    </tr>

    <tr>
      <td colspan="4">Signature</td>
    </tr>

    <tr>
      <td>Version</td>
      <td>Client ID</td>
      <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
          only to align table nicely</em></td>
    </tr>

    <tr>
      <td colspan="4"><br />Header Address<sup>O</sup><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4"><br />Block Offset <em>(variable
          size)</em><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4"><br />Page Bitmap <em>(variable size and
          optional)</em><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4"><br />Data Block Addresses <em>(variable
          size and optional)</em><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4">Checksum</td>
    </tr>

  </table>

  <table class="note">
    <tr>
      <td width="60%">&nbsp;</td>
      <td width="40%">
        (Items marked with an &lsquo;O&rsquo; in the above table are
        of the size specified in the <a href="#SizeOfOffsetsV0">Size
          of Offsets</a> field in the superblock.)
    </td></tr>
  </table>

</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Extensible Array Secondary Block
    </caption>
	<tr>
      <th width="40%">Field Name</th>
      <th>Description</th>
    </tr>

    <tr>
      <td><p>Signature</p></td>
      <td>
        <p>The ASCII character string &ldquo;<code>EASB</code>&rdquo;
          is used to indicate the beginning of an Extensible Array
          Secondary Block. This gives file consistency checking utilities
          a better chance of reconstructing a damaged file.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Version</p></td>
      <td>
        <p>This document describes version 0.</p>
      </td>
    </tr>

	<tr>
      <td><p>Client ID</p></td>
      <td>
        <p>The ID for identifying the client of the
          Extensible Array:

          <table class="list">
            <tr>
              <th width="20%" align="center">ID</th>
              <th width="80%" align="left">Description</th>
            </tr>

            <tr>
              <td align="center"><code>0</code></td>
              <td>Non-filtered dataset chunks
              </td>
            </tr>
            <tr>
              <td align="center"><code>1</code></td>
              <td>Filtered dataset chunks
              </td>
            </tr>
            <tr>
              <td align="center"><code>2+</code></td>
              <td>Reserved.
              </td>
            </tr>
          </table>
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Header Address</p></td>
	  <td>
	    <p>The address of the Extensible Array header. Principally
          used for file integrity checking.</p>
	  </td>
    </tr>

    <tr>
      <td><p>Block Offset</p></td>
	  <td>
	    <p>Stores the offset of the block in the array.
        </p>
	  </td>
    </tr>

	<tr>
	  <td><p>Page Bitmap</p></td>
	  <td>
        <p>A bitmap indicating which
          data block pages are initialized.
	    <p>
	      Exists only if the data block is paged.
      </td>
	</tr>

    <tr>
      <td><p>Data Block Addresses</p></td>
      <td>
        <p>Contains the addresses of the data blocks
          referenced by this secondary block.</p>
      </td>
    </tr>

    <tr>
      <td><p>Checksum</p></td>
      <td>
        <p>The checksum for the Extensible Array
          Secondary Block.</p>
      </td>
    </tr>

  </table>
</div>

<br />
<br />
<br />
<div align="center">
  <table class="format">
    <caption>
      Layout: Extensible Array Data Block
    </caption>

    <tr>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
    </tr>

    <tr>
      <td colspan="4">Signature</td>
    </tr>

    <tr>
      <td>Version</td>
      <td>Client ID</td>
      <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
          only to align table nicely</em></td>
    </tr>

    <tr>
      <td colspan="4"><br />Header Address<sup>O</sup><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4"><br />Block Offset <em>(variable
          size)</em><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4"><br />Elements <em>(variable size and
          optional)</em><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4">Checksum</td>
    </tr>

  </table>

  <table class="note">
    <tr>
      <td width="60%">&nbsp;</td>
      <td width="40%">
        (Items marked with an &lsquo;O&rsquo; in the above table are
        of the size specified in the <a href="#SizeOfOffsetsV0">Size
          of Offsets</a> field in the superblock.)
    </td></tr>
  </table>

</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Extensible Array Data Block
    </caption>
	<tr>
      <th width="40%">Field Name</th>
      <th>Description</th>
    </tr>

    <tr>
      <td><p>Signature</p></td>
      <td>
        <p>The ASCII character string &ldquo;<code>EADB</code>&rdquo;
          is used to indicate the beginning of an Extensible Array
          data block. This gives file consistency checking utilities
          a better chance of reconstructing a damaged file.
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Version</p></td>
      <td>
        <p>This document describes version 0.</p>
      </td>
    </tr>

	<tr>
      <td><p>Client ID</p></td>
      <td>
        <p>The ID for identifying the client of the
          Extensible Array:

          <table class="list">
            <tr>
              <th width="20%" align="center">ID</th>
              <th width="80%" align="left">Description</th>
            </tr>

            <tr>
              <td align="center"><code>0</code></td>
              <td>Non-filtered dataset chunks
              </td>
            </tr>
            <tr>
              <td align="center"><code>1</code></td>
              <td>Filtered dataset chunks
              </td>
            </tr>
            <tr>
              <td align="center"><code>2+</code></td>
              <td>Reserved.
              </td>
            </tr>
          </table>
        </p>
      </td>
    </tr>

    <tr>
      <td><p>Header Address</p></td>
	  <td>
	    <p>The address of the Extensible Array header. Principally
          used for file integrity checking.
        </p>
	  </td>
    </tr>

	<tr>
	  <td><p>Block Offset</p></td>
	  <td>
        <p>The offset of the block in the array.
      </td>
	</tr>

	<tr>
	  <td><p>Elements</p></td>
	  <td>
	    <p>Contains the elements stored in the data block and
		  exists only if the data block is not paged.
          <br />
          <br />
	      There are two element types:
          <table class="list">
            <tr>
              <th width="20%" align="center">ID</th>
              <th width="80%" align="left">Description</th>
            </tr>

            <tr>
              <td align="center"><code>0</code></td>
              <td><a href="#EaNonFilterChunk">Non-filtered dataset chunks</i></a>
</td>
</tr>
<tr>
  <td align="center"><code>1</code></td>
  <td><a href="#EaFilterChunk">Filtered dataset chunks</i></a>
</td>
</tr>
</table>
</p>
</td>
</tr>

<tr>
  <td><p>Checksum</p></td>
  <td>
    <p>The checksum for the Extensible Array data block.</p>
  </td>
</tr>

</table>
</div>

<br />
<br />
<br />
<div align="center">
  <table class="format">
    <caption>
      Layout: Extensible Array Data Block Page
    </caption>

    <tr>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
      <th>byte</th>
    </tr>

    <tr>
      <td colspan="4"><br />Elements <em>(variable
          size)</em><br /><br /></td>
    </tr>

    <tr>
      <td colspan="4">Checksum</td>
    </tr>

  </table>
</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Extensible Array Data Block Page
    </caption>
	<tr>
      <th width="40%">Field Name</th>
      <th>Description</th>
    </tr>

	<tr>
	  <td><p>Elements</p></td>
	  <td>
	    <p>Contains the elements stored in the data block
          page.</p>
        <p>
	      There are two element types:
          <table class="list">
            <tr>
              <th width="20%" align="center">ID</th>
              <th width="80%" align="left">Description</th>
            </tr>

            <tr>
              <td align="center"><code>0</code></td>
              <td><a href="#EaNonFilterChunk">Non-filtered dataset chunks</i></a>
</td>
</tr>
<tr>
  <td align="center"><code>1</code></td>
  <td><a href="#EaFilterChunk">Filtered dataset chunks</i></a>
</td>
</tr>
</table>
</p>
</td>
</tr>

<tr>
  <td><p>Checksum</p></td>
  <td>
    <p>The checksum for an Extensible Array data block
      page.</p>
  </td>
</tr>

</table>
</div>

<br />
<br />
<br />
<a name="EaNonFilterChunk"></a>
<div align="center">
  <table class="format">
    <caption>
      Layout: Data Block Element for Non-filtered Dataset Chunk
    </caption>

	<tr>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	</tr>

	<tr>
	  <td colspan="4"><br />Address<sup>O</sup><br /><br /></td>
	</tr>

  </table>

  <table class="note">
    <tr><td>
        <tr>
          <td width="60%">&nbsp;</td>
          <td width="40%">
            (Items marked with an &lsquo;O&rsquo; in the above table are
            of the size specified in the <a href="#SizeOfOffsetsV0">Size
              of Offsets</a> field in the superblock.)
        </td></tr>
  </table>
</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Data Block Element for Non-filtered Dataset Chunk
    </caption>
	<tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
	</tr>

	<tr>
	  <td><p>Address</p></td>
	  <td><p>The address of the dataset chunk in the file.
        </p>
      </td>
	</tr>

  </table>
</div>
</p>

<br />
<br />
<br />
<a name="EaFilterChunk"></a>
<div align="center">
  <table class="format">
    <caption>
      Layout: Data Block Element for Filtered Dataset Chunk
    </caption>

	<tr>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	  <th width="25%">byte</th>
	</tr>

	<tr>
	  <td colspan="4"><br />Address<sup>O</sup><br /><br /></td>
	</tr>

	<tr>
	  <td colspan="4"><br />Chunk Size<em> (variable size; at
          most 8 bytes)</em><br /><br /></td>
	</tr>

	<tr>
	  <td colspan="4">Filter Mask</td>
	</tr>

  </table>

  <table class="note">
    <tr>
      <td width="60%">&nbsp;</td>
      <td width="40%">
        (Items marked with an &lsquo;O&rsquo; in the above table are
        of the size specified in the <a href="#SizeOfOffsetsV0">Size
          of Offsets</a> field in the superblock.)
    </td></tr>
  </table>
</div>

<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Data Block Element for Filtered Dataset Chunk
    </caption>
	<tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
	</tr>

	<tr>
	  <td><p>Address</p></td>
	  <td><p>The address of the dataset chunk in the file.
        </p>
      </td>
	</tr>

	<tr>
	  <td><p>Chunk Size</p></td>
	  <td><p>The size of the dataset chunk in bytes.
        </p>
      </td>
	</tr>

	<tr>
	  <td><p>Filter Mask</p></td>
	  <td><p>Indicates the filter to skip for the dataset chunk.
          Each filter has an index number in the pipeline; if that
          filter is skipped, the bit corresponding to its index is set.
        </p>
      </td>
	</tr>

  </table>
</div>

<a name="AppendV2Btrees">
  <h3>VII.E. The Version 2 B-trees Index</h3></a>

<p>The <i>Version 2 B-trees</i> index can be used when the dataset
  fulfills the following condition:</p>

<ul>
  <li>more than one dimension of unlimited extent</li>
</ul>

<p>Version 2 B-trees can be used to index various objects in the
  library. See <a href="#V2Btrees">&ldquo;Version 2 B-trees&rdquo;</a>
  for more information. The B-tree types <a href="#V2BtType10">10</a>
  and <a href="#V2BtreesType11">11</a> record layouts are for
  indexing dataset chunks.</p>

<h2><a name="AppendixD"> VIII. Appendix D:
    Encoding for dataspace and reference</a></h2>

<a name="DataspaceEncode">
  <h3>VIII.A. Dataspace Encoding </h3></a>
<i>H5Sencode</i> is a public routine that encodes a dataspace description into a buffer while
<i>H5Sdecode</i> is the corresponding routine that decodes the description encoded in the buffer.
<p>
  See the reference manual description for these two public routines.

  <br />
  <br />
  <br />
  <div align="center">
    <table class="format">
      <caption>
        Layout: Dataspace Description for H5Sencode/H5Sdecode
      </caption>

      <tr>
        <th>byte</th>
        <th>byte</th>
        <th>byte</th>
        <th>byte</th>
      </tr>

      <tr>
        <td>Dataspace ID</td>
        <td>Encode Version</td>
        <td>Size of Size</td>
        <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
            only to align table nicely</em></td>
      </tr>

      <tr>
        <td colspan="4"><br />Size of Extent
          <br /><br /></td>
      </tr>

      <tr>
        <td colspan="4"><br /><br />Dataspace Message
          <em>(variable size)</em>
          <br /><br /></td>
      </tr>

      <tr>
        <td colspan="4"><br /><br />Dataspace Selection
          <em>(variable size)</em>
          <br /><br /></td>
      </tr>

    </table>

  </div>

  <br />
  <br />
  <div align="center">
    <table class="desc">
      <caption>
        Fields: Dataspace Description for H5Sencode/H5Sdecode
      </caption>
	  <tr>
        <th width="40%">Field Name</th>
        <th>Description</th>
      </tr>

      <tr>
        <td><p>Dataspace ID</p></td>
        <td>
          <p>The datspace message ID which is 1.</p>
        </td>
      </tr>

	  <tr>
        <td><p>Encode Version</p></td>
        <td>
          <p>H5S_ENCODE_VERSION which is 0.
          </p>
        </td>
      </tr>

      <tr>
        <td><p>Size of Size</p></td>
	    <td>
	      <p>The number of bytes used to store the size of an object.
          </p>
	    </td>
      </tr>

      <tr>
        <td><p>Size of Extent</p></td>
	    <td>
	      <p>Size of the dataspace message.
          </p>
	    </td>
      </tr>

      <tr>
        <td><p>Dataspace Message</p></td>
	    <td>
	      <p>The dataspace message information.  See
            <a href="#DataspaceMessage">Dataspace Message.</a></p>
</p>
</td>
</tr>

<tr>
  <td><p>Dataspace Selection</p></td>
  <td>
    <p>The dataspace selection information.  See
      <a href="#DataspaceSEL">Dataspace Selection.</a></p>
  </td>
</tr>

</table>
</div>


<br />
<br />
<br />
<a name="DataspaceSEL"></a>
  <div align="center">
    <table class="format">
	  <caption>
	    Layout: Dataspace Selection
	  </caption>

	  <tr>
	    <th width="25%">byte</th>
	    <th width="25%">byte</th>
	    <th width="25%">byte</th>
	    <th width="25%">byte</th>
	  </tr>

	  <tr>
	    <td colspan="4">Selection Type</td>
	  </tr>
	  <tr>
        <td colspan="4"><br />Selection Info (<em>variable
            size</em>)<br /><br /></td>
      </tr>

    </table>
  </div>

  <br />
  <br />
  <div align="center">
    <table class="desc">
	  <caption>
	    Fields: Dataspace Selection
	  </caption>
	  <tr>
        <th width="30%">Field Name</th>
        <th>Description</th>
	  </tr>

	  <tr>
	    <td><p>Selection Type</p></td>
	    <td>
	      <p>There are 4 types of selection:
	        <table class="list">
		      <tr>
		        <th width="20%" align="center">Value</th>
		        <th width="80%" align="left">Description</th>
		      </tr>

		      <tr>
		        <td align="center"><code>0</code></td>
		        <td>H5S_SEL_NONE: Nothing selected
                </td>
		      </tr>

		      <tr>
		        <td align="center"><code>1</code></td>
		        <td>H5S_SEL_POINTS: Sequence of points selected
                </td>
		      </tr>

		      <tr>
		        <td align="center"><code>2</code></td>
		        <td>H5S_SEL_HYPER: Hyperslab selected
                </td>
		      </tr>

		      <tr>
		        <td align="center"><code>3</code></td>
		        <td>H5S_SEL_ALL: Entire extent selected
                </td>
		      </tr>
	        </table>
        </td>

	  </tr>

	  <tr>
	    <td><p>Selection Info</p></td>
	    <td>
	      <p>There are 4 types of selection info:
	        <table class="list">
		      <tr>
		        <th width="20%" align="center">Value</th>
		        <th width="80%" align="left">Description</th>
		      </tr>
		      <tr>
		        <td align="center"><code>0</code></td>
		        <td>Selection info for <a href="#SelNONE">H5S_SEL_NONE</a>
                </td>
		      </tr>

		      <tr>
		        <td align="center"><code>1</code></td>
		        <td>Selection info for <a href="#SelPOINTS">H5S_SEL_POINTS</a>
                </td>
		      </tr>

		      <tr>
		        <td align="center"><code>2</code></td>
		        <td>Selection info for <a href="#SelHYPER">H5S_SEL_HYPER</a>
                </td>
		      </tr>

		      <tr>
		        <td align="center"><code>3</code></td>
		        <td>Selection for <a href="#SelALL">H5S_SEL_ALL</a>
                </td>
		      </tr>
	        </table>
        </td>

	  </tr>
    </table>
  </div>


  <br />
  <br />
  <br />
<a name="SelNONE"/></a>
    <div align="center">
      <table class="format">
	    <caption>
	      Layout: Selection Info for H5S_SEL_NONE
	    </caption>

	    <tr>
	      <th width="25%">byte</th>
	      <th width="25%">byte</th>
	      <th width="25%">byte</th>
	      <th width="25%">byte</th>
	    </tr>

	    <tr>
	      <td colspan="4">Version</td>
	    </tr>
	    <tr>
	      <td colspan="4"><br />Reserved <em>(zero, 8 bytes)</em><br /><br /></td>
	    </tr>

      </table>
    </div>

    <br />
    <br />
    <div align="center">
      <table class="desc">
	    <caption>
          Fields: Selection Info for H5S_SEL_NONE
	    </caption>
	    <tr>
          <th width="30%">Field Name</th>
          <th>Description</th>
	    </tr>

	    <tr>
	      <td><p>Version</p></td>
	      <td><p>The version number for the H5S_SEL_NONE Selection Info.
              The value is 1.</p></td>
	    </tr>
      </table>
    </div>


    <br />
    <br />
    <br />
    <a name="SelPOINTS"></a>
      <div align="center">
        <table class="format">
	      <caption>
	        Layout: Selection Info for H5S_SEL_POINTS
	      </caption>

	      <tr>
	        <th width="25%">byte</th>
	        <th width="25%">byte</th>
	        <th width="25%">byte</th>
	        <th width="25%">byte</th>
	      </tr>

	      <tr>
	        <td colspan="4">Version</td>
	      </tr>
	      <tr>
            <td colspan="4"><br /><br />Points Selection Info <em>(variable size)</em>
              <br /><br /><br /></td>
	      </tr>

        </table>
      </div>

      <br />
      <br />
      <div align="center">
        <table class="desc">
	      <caption>
	        Fields: Selection Info for H5S_SEL_POINTS
	      </caption>
	      <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
	      </tr>

	      <tr>
	        <td><p>Version</p></td>
	        <td><p>The version number for the H5S_SEL_POINTS Selection Info.
                The value is either 1 or 2.</p></td>
	      </tr>

	      <tr>
	        <td><p>Points Selection Info</p></td>
	        <td><p>Depending on <em>version</em>:
	            <table class="list">
		          <tr>
		            <th width="20%" align="center">Version</th>
		            <th width="80%" align="left">Description</th>
		          </tr>

		          <tr>
		            <td align="center"><code>1</code></td>
		            <td>See <a href="#SelPOINTSV1">Version 1 Points Selection Info</a>
                    </td>
		          </tr>

		          <tr>
		            <td align="center"><code>2</code></td>
		            <td>See <a href="#SelPOINTSV2">Version 2 Points Selection Info</a>
                    </td>
		          </tr>

	            </table>
	        </td>
	      </tr>

        </table>
      </div>

      <br />
      <br />
      <br />
      <a name="SelPOINTSV1"></a>
        <div align="center">
          <table class="format">
	        <caption>
	          Layout: Version 1 Points Selection Info
	        </caption>

	        <tr>
	          <th width="25%">byte</th>
	          <th width="25%">byte</th>
	          <th width="25%">byte</th>
	          <th width="25%">byte</th>
	        </tr>

	        <tr>
              <td colspan="4">Reserved <em>(zero)</em></td>
	        </tr>

	        <tr>
	          <td colspan="4">Length</td>
	        </tr>
	        <tr>
	          <td colspan="4">Rank</td>
	        </tr>
	        <tr>
	          <td colspan="4">Num Points</td>
	        </tr>
	        <tr>
	          <td colspan="4">Point #1: coordinate #1</td>
	        </tr>
	        <tr>
	          <td colspan="4">.<br />.<br />.<br /></td>
	        </tr>
	        <tr>
	          <td colspan="4">Point #1: coordinate #u</td>
	        </tr>
	        <tr>
	          <td colspan="4">.<br />.<br />.<br /></td>
	        </tr>
	        <tr>
	          <td colspan="4">Point #n: coordinate #1</td>
	        </tr>
	        <tr>
	          <td colspan="4">.<br />.<br />.<br /></td>
	        </tr>
	        <tr>
	          <td colspan="4">Point #n: coordinate #u</td>
	        </tr>

          </table>
        </div>

        <br />
        <br />
        <div align="center">
          <table class="desc">
	        <caption>
	          Fields: Version 1 Points Selection Info
	        </caption>
	        <tr>
              <th width="30%">Field Name</th>
              <th>Description</th>
	        </tr>

	        <tr>
	          <td><p>Length</p></td>
	          <td><p>The size in bytes from <em>Length</em> to the end of the
                  selection info.</td>
	        </tr>

	        <tr>
	          <td><p>Rank</p></td>
	          <td><p>The number of dimensions.</p></td>
	        </tr>
	        <tr>
	          <td><p>Num Points</p></td>
	          <td><p>The number of points in the selection.</p></td>
	        </tr>
	        <tr>
	          <td><p>Point #n: coordinate #u</p></td>
	          <td><p>The array of points in the selection.
                <p>The points selected are #1 to #n where n is <em>Num Points</em>.
                <p>The list of coordinates for each point are #1 to #u where u is
                  <em>Rank</em>.</p></td>
	        </tr>
          </table>
        </div>


        <br />
        <br />
        <br />
        <a name="SelPOINTSV2"></a>
          <div align="center">
            <table class="format">
	          <caption>
	            Layout: Version 2 Points Selection Info
	          </caption>

	          <tr>
	            <th width="25%">byte</th>
	            <th width="25%">byte</th>
	            <th width="25%">byte</th>
	            <th width="25%">byte</th>
	          </tr>

	          <tr>
                <td colspan="1">Encode Size</td>
                <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em>
                </td>
	          </tr>

	          <tr>
	            <td colspan="4">Rank</td>
	          </tr>
	          <tr>
	            <td colspan="4">Num Points<p>(2, 4 or 8 bytes)<br /></td>
	          </tr>
              <tr>
                <td colspan="4">Point #1: coordinate #1<p>(2, 4 or 8 bytes)<br /></td>
              </tr>
              <tr>
                <td colspan="4">.<br />.<br />.<br /></td>
              </tr>
              <tr>
                <td colspan="4">Point #1: coordinate #u<p>(2, 4 or 8 bytes)<br /></td>
              </tr>
              <tr>
                <td colspan="4">.<br />.<br />.<br /></td>
              </tr>
              <tr>
                <td colspan="4">Point #n: coordinate #1 <p>(2, 4 or 8 bytes)<br /></td>
              </tr>
              <tr>
                <td colspan="4">.<br />.<br />.<br /></td>
              </tr>
              <tr>
                <td colspan="4">Point #n: coordinate #u<p>(2, 4 or 8 bytes)<br /></td>
              </tr>

            </table>
          </div>

          <br />
          <br />
          <div align="center">
            <table class="desc">
	          <caption>
	            Fields: Version 2 Points Selection Info
	          </caption>
	          <tr>
                <th width="30%">Field Name</th>
                <th>Description</th>
	          </tr>

	          <tr>
	            <td><p>Encode Size</td>
	            <td><p>The size for encoding the points selection info which can be 2, 4 or 8 bytes.
                </td>
	          </tr>

	          <tr>
	            <td><p>Rank</p></td>
	            <td><p>The number of dimensions.</p></td>
	          </tr>
	          <tr>
	            <td><p>Num Points</p></td>
	            <td><p>The number of points in the selection.
                  <p>The field <em>Encode Size</em> indicates the size of this field</p></td>
	          </tr>
	          <tr>
	            <td><p>Point #n: coordinate #u</p></td>
	            <td><p>The array of points in the selection.
                  <p>The points selected are #1 to #n where n is <em>Num Points</em>.
                  <p>The list of coordinates for each point are #1 to #u where u is
                    <em>Rank</em>.
                  <p>The field <em>Encode Size</em> indicates the size of this field</p></td>
	          </tr>
            </table>
          </div>


          <br />
          <br />
          <br />
          <a name="SelHYPER"></a>
            <div align="center">
              <table class="format">
	            <caption>
	              Layout: Selection Info for H5S_SEL_HYPER
	            </caption>

	            <tr>
	              <th width="25%">byte</th>
	              <th width="25%">byte</th>
	              <th width="25%">byte</th>
	              <th width="25%">byte</th>
	            </tr>

	            <tr>
	              <td colspan="4">Version</td>
	            </tr>
	            <tr>
                  <td colspan="4"><br />Hyperslab Selection Info
                    (<em>variable size</em>)<br /><br /></td>
                </tr>

              </table>
            </div>

            <br />
            <br />
            <div align="center">
              <table class="desc">
	            <caption>
	              Fields: Selection Info for H5S_SEL_HYPER
	            </caption>
	            <tr>
                  <th width="30%">Field Name</th>
                  <th>Description</th>
	            </tr>

	            <tr>
	              <td><p>Version</p></td>
	              <td><p>The version number for the H5S_SEL_HYPER selection info.
	                  The value is 1, 2 or 3.</p></td>
	            </tr>

	            <tr>
	              <td><p>Hyperslab Selection Info</p></td>
	              <td><p>Depending on <em>version</em>:
	                  <table class="list">
		                <tr>
		                  <th width="20%" align="center">Version</th>
		                  <th width="80%" align="left">Description</th>
		                </tr>

		                <tr>
		                  <td align="center"><code>1</code></td>
		                  <td>See <a href="#SelHYPERV1">Version 1 Hyperslab Selection Info</a>.
                          </td>
		                </tr>

		                <tr>
		                  <td align="center"><code>2</code></td>
		                  <td>See <a href="#SelHYPERV2">Version 2 Hyperslab Selection Info</a>
                          </td>
		                </tr>

		                <tr>
		                  <td align="center"><code>3</code></td>
		                  <td>See <a href="#SelHYPERV3">Version 3 Hyperslab Selection Info</a>
                          </td>
		                </tr>
	                  </table>
	              </td>
	            </tr>

              </table>
            </div>

            <br />
            <br />
            <br />
            <a name="SelHYPERV1"></a>
              <div align="center">
                <table class="format">
	              <caption>
	                Layout: Version 1 Hyperslab Selection Info
	              </caption>

	              <tr>
	                <th width="25%">byte</th>
	                <th width="25%">byte</th>
	                <th width="25%">byte</th>
	                <th width="25%">byte</th>
	              </tr>

	              <tr>
                    <td colspan="4">Reserved</td>
	              </tr>
	              <tr>
	                <td colspan="4">Length</td>
	              </tr>
	              <tr>
	                <td colspan="4">Rank</td>
	              </tr>
	              <tr>
	                <td colspan="4">Num Blocks</td>
	              </tr>
	              <tr>
	                <td colspan="4">Starting Offset #1 for Block #1</td>
                  </tr>
	              <tr>
	                <td colspan="4">.<br />.<br />.<br /></td>
	              </tr>
	              <tr>
	                <td colspan="4">Starting Offset #n for Block #1</td>
                  </tr>

	              <tr>
	                <td colspan="4">Ending Offset #1 for Block #1</td>
                  </tr>
	              <tr>
	                <td colspan="4">.<br />.<br />.<br /></td>
	              </tr>
	              <tr>
	                <td colspan="4">Ending Offset #n for Block #1</td>
                  </tr>

	              <tr>
	                <td colspan="4">.<br />.<br />.<br /></td>
	              </tr>
	              <tr>
	                <td colspan="4">.<br />.<br />.<br /></td>
	              </tr>
	              <tr>
	                <td colspan="4">.<br />.<br />.<br /></td>
	              </tr>

	              <tr>
	                <td colspan="4">Starting Offset #1 for Block #u</td>
                  </tr>
	              <tr>
	                <td colspan="4">.<br />.<br />.<br /></td>
	              </tr>
	              <tr>
	                <td colspan="4">Starting Offset #n for Block #u</td>
                  </tr>

	              <tr>
	                <td colspan="4">Ending Offset #1 for Block #u</em></td>
</tr>
<tr>
  <td colspan="4">.<br />.<br />.<br /></td>
</tr>
<tr>
  <td colspan="4">Ending Offset #n for Block #u</td>
</tr>

</table>
</div>

<br />
<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Version 1 Hyperslab Selection Info
    </caption>
	<tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
	</tr>

	<tr>
	  <td><p>Length</p></td>
	  <td><p>The size in bytes from the field <em>Rank</em> to the
          end of the Selection Info.</td>
	</tr>

	<tr>
	  <td><p>Rank</p></td>
	  <td><p>The number of dimensions in the dataspace.</p></td>
	</tr>

	<tr>
	  <td><p>Num Blocks</p></td>
	  <td><p>The number of blocks in the selection.</p></td>
	</tr>

    <tr>
      <td><p>Starting Offset #n for Block #u</p></td>
      <td><p>The offset #n of the starting element in block #u.
        <p>#n is from 1 to <em>Rank</em>.
        <p>#u is from 1 to <em>Num Blocks</em> moving from the fastest
          changing dimension to the slowest changing dimension.
      </p></td>
    </tr>

    <tr>
      <td><p>Ending Offset #n for Block #u</p></td>
      <td><p>The offset #n of the ending element in block #u.
        <p>#n is from 1 to <em>Rank</em>.
        <p>#u is from 1 to <em>Num Blocks</em> moving from the fastest
          changing dimension to the slowest changing dimension.
      </p></td>
    </tr>

  </table>
</div>

<br />
<br />
<br />
<a name="SelHYPERV2"></a>
  <div align="center">
    <table class="format">
	  <caption>
	    Layout: Version 2 Hyperslab Selection Info
	  </caption>

	  <tr>
	    <th width="25%">byte</th>
	    <th width="25%">byte</th>
	    <th width="25%">byte</th>
	    <th width="25%">byte</th>
	  </tr>

	  <tr>
	    <td>Flags</td>
        <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
            only to align table nicely</em></td>
	  </tr>
	  <tr>
	    <td colspan="4">Length</td>
	  </tr>
	  <tr>
	    <td colspan="4">Rank</td>
	  </tr>
	  <tr>
	    <td colspan="4">Start #1 <em>(8 bytes)</em><p></td>
      </tr>
	  <tr>
	    <td colspan="4">Stride #1 <em>(8 bytes)</em><p></td>
      </tr>
	  <tr>
	    <td colspan="4">Count #1 <em>(8 bytes)</em><p></td>
      </tr>
	  <tr>
	    <td colspan="4">Block #1 <em>(8 bytes)</em><p></td>
      </tr>
	  <tr>
	    <td colspan="4">.<br />.<br />.<br /></td>
	  </tr>
	  <tr>
	    <td colspan="4">Start #n <em>(8 bytes)</em><p></td>
      </tr>

	  <tr>
	    <td colspan="4">Stride #n <em>(8 bytes)</em><p></td>
      </tr>
	  <tr>
	    <td colspan="4">Count #n <em>(8 bytes)</em><p></td>
      </tr>
	  <tr>
	    <td colspan="4">Block #n <em>(8 bytes)</em><p></td>
      </tr>

    </table>
  </div>

  <br />
  <br />
  <div align="center">
    <table class="desc">
      <caption>
	    Fields: Version 2 Hyperslab Selection Info
      </caption>
	  <tr>
        <th width="30%">Field Name</th>
        <th>Description</th>
	  </tr>

	  <tr>
	    <td><p>Flags</p></td>
	    <td><p>This is a bit field with the following definition.
            Currently, this is always set to 0x1.
          <p>
            <table class="list">
              <tr>
                <th width="20%" align="center">Bit</th>
                <th width="80%" align="left">Description</th>
              </tr>
              <tr>
                <td align="center"><code>0</code></td>
                <td>If set, it is a regular hyperslab, otherwise, irregular.
                </td>
              </tr>

            </table>
        </td>

	  </tr>

	  <tr>
	    <td><p>Length</p></td>
	    <td><p>The size in bytes from the field <em>Rank</em> to the
            end of the Selection Info.</td>
	  </tr>

	  <tr>
	    <td><p>Rank</p></td>
	    <td><p>The number of dimensions in the dataspace.</td>
	  </tr>

      <tr>
        <td><p>Start #n</p></td>
        <td><p>The offset of the starting element in the block.
          <p>#n is from 1 to <em>Rank</em>.
        </p></td>
      </tr>

      <tr>
        <td><p>Stride #n</p></td>
        <td><p>The number of elements to move in each dimension.
          <p>#n is from 1 to <em>Rank</em>.
        </p></td>
      </tr>

      <tr>
        <td><p>Count #n</p></td>
        <td><p>The number of blocks to select in each dimension.
          <p>#n is from 1 to <em>Rank</em>.
        </p></td>
      </tr>

      <tr>
        <td><p>Block #n</p></td>
        <td><p>The size (in elements) of each block in each dimension.
          <p>#n is from 1 to <em>Rank</em>.
        </p></td>
      </tr>
    </table>
  </div>




  <br />
  <br />
  <br />
  <a name="SelHYPERV3"></a>
    <div align="center">
      <table class="format">
	    <caption>
	      Layout: Version 3 Hyperslab Selection Info
	    </caption>

	    <tr>
	      <th width="25%">byte</th>
	      <th width="25%">byte</th>
	      <th width="25%">byte</th>
	      <th width="25%">byte</th>
	    </tr>

	    <tr>
	      <td>Flags</td>
	      <td>Encode Size</td>
          <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
              only to align table nicely</em></td>
	    </tr>
	    <tr>
	      <td colspan="4">Rank</td>
	    </tr>
	    <tr>
	      <td colspan="4"><br />Regular/Irregular Hyperslab Selection Info
            <p><em>(variable size)</em><br /><br/></td>
	    </tr>

      </table>
    </div>

    <br />
    <br />
    <div align="center">
      <table class="desc">
        <caption>
	      Fields: Version 3 Hyperslab Selection Info
        </caption>
	    <tr>
          <th width="30%">Field Name</th>
          <th>Description</th>
	    </tr>

	    <tr>
	      <td><p>Flags</p></td>
	      <td><p>This is a bit field with the following definition:
            <p>
              <table class="list">
                <tr>
                  <th width="20%" align="center">Bit</th>
                  <th width="80%" align="left">Description</th>
                </tr>
                <tr>
                  <td align="center"><code>0</code></td>
                  <td>If set, it is a regular hyperslab, otherwise, irregular.
                  </td>
                </tr>

              </table>
          </td>
	    </tr>

	    <tr>
	      <td><p>Encode Size</p></td>
	      <td><p>The size for encoding hyperslab selection info, which can 2, 4 or 8 bytes.</td>
	    </tr>

	    <tr>
	      <td><p>Rank</p></td>
	      <td><p>The number of dimensions in the dataspace.</td>
	    </tr>

	    <tr>
	      <td><p>Regular/Irregular Hyperslab Selection Info</p></td>
	      <td><p>This is the selection info for version 3 hyperslab which can be regular or irregular.
            <p>If bit 0 of the field <em>Flags</em> is set,
              See <a href="#SelHYPERV3REG">Version 3 Regular Hyperslab Selection Info</a>
            <p>Otherwise, see <a href="#SelHYPERV3IRREG">Version 3 Irregular Hyperslab Selection Info</a>
          </td>

	    </tr>

      </table>
    </div>


    <br />
    <br />
    <br />
    <a name="SelHYPERV3REG"></a>
      <div align="center">
        <table class="format">
	      <caption>
	        Layout: Version 3 Regular Hyperslab Selection Info
	      </caption>

	      <tr>
	        <th width="25%">byte</th>
	        <th width="25%">byte</th>
	        <th width="25%">byte</th>
	        <th width="25%">byte</th>
	      </tr>

	      <tr>
	        <td colspan="4">Start #1 <p><em>(2, 4 or 8 bytes)</em><p></td>
          </tr>
	      <tr>
	        <td colspan="4">Stride #1 <p><em>(2, 4 or 8 bytes)</em><p></td>
          </tr>
	      <tr>
	        <td colspan="4">Count #1 <p><em>(2, 4 or 8 bytes)</em><p></td>
          </tr>
	      <tr>
	        <td colspan="4">Block #1 <p><em>(2, 4 or 8 bytes)</em><p></td>
          </tr>
	      <tr>
	        <td colspan="4">.<br />.<br />.<br /></td>
	      </tr>
	      <tr>
	        <td colspan="4">Start #n <p><em>(2, 4 or 8 bytes)</em><p></td>
          </tr>

	      <tr>
	        <td colspan="4">Stride #n <p><em>(2, 4 or 8 bytes)</em><p></td>
          </tr>
	      <tr>
	        <td colspan="4">Count #n <p><em>(2, 4 or 8 bytes)</em><p></td>
          </tr>
	      <tr>
	        <td colspan="4">Block #n <p><em>(2, 4 or 8 bytes)</em><p></td>
          </tr>

        </table>
      </div>

      <br />
      <br />
      <div align="center">
        <table class="desc">
          <caption>
	        Fields: Version 3 Regular Hyperslab Selection Info
          </caption>
	      <tr>
            <th width="30%">Field Name</th>
            <th>Description</th>
	      </tr>

          <tr>
            <td><p>Start #n</p></td>
            <td><p>The offset of the starting element in the block.
              <p>#n is from 1 to <em>Rank</em>.
              <p>The field <em>Encode Size</em> indicates the size of this field.
            </p></td>
          </tr>

          <tr>
            <td><p>Stride #n</p></td>
            <td><p>The number of elements to move in each dimension.
              <p>#n is from 1 to <em>Rank</em>.
              <p>The field <em>Encode Size</em> indicates the size of this field.
            </p></td>
          </tr>

          <tr>
            <td><p>Count #n</p></td>
            <td><p>The number of blocks to select in each dimension.
              <p>#n is from 1 to <em>Rank</em>.
              <p>The field <em>Encode Size</em> indicates the size of this field.
            </p></td>
          </tr>

          <tr>
            <td><p>Block #n</p></td>
            <td><p>The size (in elements) of each block in each dimension.
              <p>#n is from 1 to <em>Rank</em>.
              <p>The field <em>Encode Size</em> indicates the size of this field.
            </p></td>
          </tr>
        </table>
      </div>

      <br />
      <br />
      <br />
      <a name="SelHYPERV3IRREG"></a>
        <div align="center">
          <table class="format">
	        <caption>
	          Layout: Version 3 Irregular Hyperslab Selection Info
	        </caption>

	        <tr>
	          <th width="25%">byte</th>
	          <th width="25%">byte</th>
	          <th width="25%">byte</th>
	          <th width="25%">byte</th>
	        </tr>

	        <tr>
	          <td colspan="4">Num Blocks<p><em>(2, 4 or 8 bytes)</em><p></td>
	        </tr>
	        <tr>
	          <td colspan="4">Starting Offset #1 for Block #1<p><em>(2, 4 or 8 bytes)</em><p></td>
            </tr>
	        <tr>
	          <td colspan="4">.<br />.<br />.<br /></td>
	        </tr>
	        <tr>
	          <td colspan="4">Starting Offset #n for Block #1<p><em>(2, 4 or 8 bytes)</em><p></td>
            </tr>

	        <tr>
	          <td colspan="4">Ending Offset #1 for Block #1<p><em>(2, 4 or 8 bytes)</em><p></td>
            </tr>
	        <tr>
	          <td colspan="4">.<br />.<br />.<br /></td>
	        </tr>
	        <tr>
	          <td colspan="4">Ending Offset #n for Block #1<p><em>(2, 4 or 8 bytes)</em><p></td>
            </tr>

	        <tr>
	          <td colspan="4">.<br />.<br />.<br /></td>
	        </tr>
	        <tr>
	          <td colspan="4">.<br />.<br />.<br /></td>
	        </tr>
	        <tr>
	          <td colspan="4">.<br />.<br />.<br /></td>
	        </tr>

	        <tr>
	          <td colspan="4">Starting Offset #1 for Block #u<p><em>(2, 4 or 8 bytes)</em><p></td>
            </tr>
	        <tr>
	          <td colspan="4">.<br />.<br />.<br /></td>
	        </tr>
	        <tr>
	          <td colspan="4">Starting Offset #n for Block #u<p><em>(2, 4 or 8 bytes)</em><p></td>
            </tr>

	        <tr>
	          <td colspan="4">Ending Offset #1 for Block #u<p><em>(2, 4 or 8 bytes)</em><p></td>
            </tr>
	        <tr>
	          <td colspan="4">.<br />.<br />.<br /></td>
	        </tr>
	        <tr>
	          <td colspan="4">Ending Offset #n for Block #u<p><em>(2, 4 or 8 bytes)</em><p></td>
            </tr>

          </table>
        </div>

        <br />
        <br />
        <div align="center">
          <table class="desc">
            <caption>
              Fields: Version 3 Irregular Hyperslab Selection Info
            </caption>

	        <tr>
	          <td><p>Num Blocks</p></td>
	          <td><p>The number of blocks in the selection.
                <p>The field <em>Encode Size</em> indicates the size of this field</p></td>
	        </tr>

            <tr>
              <td><p>Starting Offset #n for Block #u</p></td>
              <td><p>The offset #n of the starting element in block #u.
                <p>#n is from 1 to <em>Rank</em>.
                <p>#u is from 1 to <em>Num Blocks</em> moving from the fastest
                  changing dimension to the slowest changing dimension.
                <p>The field <em>Encode Size</em> indicates the size of this field
              </p></td>
            </tr>

            <tr>
              <td><p>Ending Offset #n for Block #u</p></td>
              <td><p>The offset #n of the ending element in block #u.
                <p>#n is from 1 to <em>Rank</em>.
                <p>#u is from 1 to <em>Num Blocks</em> moving from the fastest
                  changing dimension to the slowest changing dimension.
                <p>The field <em>Encode Size</em> indicates the size of this field
              </p></td>
            </tr>

          </table>
        </div>


        <br />
        <br />
        <br />
        <a name="SelALL"></a>
          <div align="center">
            <table class="format">
	          <caption>
	            Layout: Selection Info for H5S_SEL_ALL
	          </caption>

	          <tr>
	            <th width="25%">byte</th>
	            <th width="25%">byte</th>
	            <th width="25%">byte</th>
	            <th width="25%">byte</th>
	          </tr>

	          <tr>
	            <td colspan="4">Version</td>
	          </tr>
	          <tr>
	            <td colspan="4"><br />Reserved <em>(zero,
                    8 bytes)</em><br /><br /></td>
	          </tr>

            </table>
          </div>

          <br />
          <br />
          <div align="center">
            <table class="desc">
              <caption>
                Fields: Selection Info for H5S_SEL_ALL
              </caption>
              <tr>
                <th width="30%">Field Name</th>
                <th>Description</th>
              </tr>

              <tr>
                <td><p>Version</p></td>
                <td><p>The version number for the H5S_SEL_ALL Selection Info;
                    the value is 1.</p></td>
              </tr>
            </table>
          </div>

          <a name="ReferenceEncodeRV">
            <h3>VIII.B. Reference Encoding (Revised)</h3></a>
          <p>
            <br />
            For the following reference type,
            the Reference Header and Reference Block are stored together as the dataset's raw data:
            <ul>
              <li>Object Reference (H5R_OBJECT2) (without reference to an external file)</li>
            </ul>
          <p>
            For the following reference types,
            the Reference Header plus the <a href="#GlobalHeapID">Global Heap ID</a> are stored
            as the dataset's raw data in the file.
            The global heap ID is used to locate the Reference Block stored in the global heap:
            <ul>
              <li>Object Reference (H5R_OBJECT2) (with reference to an external file)</li>
              <li>Dataset Region Reference (H5R_DATASET_REGION2) (with/without reference to an external file)</li>
              <li>Attribute Reference (H5R_ATTR) (with/without reference to an external file)</li>
            </ul>
            <br />
            <br />

            <div align="center">
              <table class="format">
                <caption>
                  Layout: Reference Header
                </caption>

	            <tr>
	              <th width="25%">byte</th>
	              <th width="25%">byte</th>
	              <th width="25%">byte</th>
	              <th width="25%">byte</th>
	            </tr>

	            <tr>
	              <td>Reference Type</td>
	              <td>Flags</td>
                  <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
                      only to align table nicely</em></td>
	            </tr>

              </table>

            </div>

            <br />
            <br />
            <div align="center">
              <table class="desc">
                <caption>
                  Fields: Reference Header
                </caption>
	            <tr>
                  <th width="30%">Field Name</th>
                  <th>Description</th>
	            </tr>

	            <tr>
	              <td><p>Reference Type</p></td>
	              <td>
                    <p>There are 3 types of references:
                      <table class="list">
                        <tr>
                          <th width="20%" align="center">Value</th>
                          <th width="80%" align="left">Description</th>
                        </tr>

                        <tr>
                          <td align="center"><code>2</code></td>
                          <td>H5R_OBJECT2: Object Reference
                          </td>
                        </tr>

                        <tr>
                          <td align="center"><code>3</code></td>
                          <td>H5R_DATASET_REGION2: Dataset Region Reference
                          </td>
                        </tr>

                        <tr>
                          <td align="center"><code>4</code></td>
                          <td>H5R_ATTR: Attribute Reference
                          </td>
                        </tr>

                      </table>

	              </td>
	            </tr>

	            <tr>
	              <td><p>Flags</p></td>
	              <td><p>This field describes the reference:
                      <table class="list">
                        <tr>
                          <th width="20%" align="center">Bit</th>
                          <th width="80%" align="left">Description</th>
                        </tr>

                        <tr>
                          <td align="center"><code>0</code></td>
                          <td>If set, the reference is to an external file.
                          </td>
                        </tr>
                        <tr>
                          <td align="center"><code>1-7</code></td>
                          <td>Reserved</td>
                        </tr>
	                </table></p>

                  </td>
	            </tr>

              </table>
            </div>

            <br />
            <br />
            <br />

            <div align="center">
              <table class="format">
                <caption>
                  Layout: Reference Block
                </caption>

	            <tr>
	              <th width="25%">byte</th>
	              <th width="25%">byte</th>
	              <th width="25%">byte</th>
	              <th width="25%">byte</th>
	            </tr>

	            <tr>
	              <td>Token Size</td>
                  <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
                      only to align table nicely</em></td>
	            </tr>
	            <tr>
                  <td colspan=4><br /><br />Token
                    <em>(variable size)</em><br /> <br /><br /></td>
	            </tr>
                <tr>
	              <td colspan=2>Length of External File Name</td>
                  <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
                      only to align table nicely</em></td>
                </tr>
                <tr>
	              <td colspan=4><br /><br />External File Name
                    <em>(variable size)</em><br /><br /><br /></td>
	            </tr>
	            <tr>
	              <td colspan=4>Size of Dataspace Selection</td>
	            </tr>
	            <tr>
	              <td colspan=4>Rank of Dataspace Selection</td>
	            </tr>
	            <tr>
	              <td colspan=4><br /><br />Dataspace Selection Information
                    <em>(variable size)</em><br /><br /> <br /></td>
</td>
</tr>
<tr>
  <td colspan=2>Length of Attribute Name </td>
  <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
      only to align table nicely</em></td>
</tr>
<tr>
  <td colspan=4><br /><br />Attribute Name
    <em>(variable size)</em><br /><br /><br /></td>
</tr>

</table>

</div>

<br />
<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Reference Block
    </caption>
	<tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
	</tr>

	<tr>
	  <td><p>Token size</p></td>
	  <td><p>This is the size of the token for the object.
	  </td>
	</tr>

	<tr>
	  <td><p>Token</p></td>
	  <td>
        <p>
          This is the token for the object.
        </p>
	  </td>
	</tr>

	<tr>
	  <td><p>Length of External File Name</p></td>
	  <td><p>This is the length for the external file name.
        <p>This field exists if bit 0 of <em>flags</em> is set.</p>
        </p>
	  </td>
	</tr>

	<tr>
	  <td><p>External File Name</p></td>
	  <td><p>This is the name of the external file being referenced.</p>
</p>
<p>This field exists if bit 0 of <em>flags</em> is set.</p>
</td>
</tr>

<tr>
  <td><p>Dataspace Selection Information</p></td>
  <td><p>See <a href="#DataspaceSEL">Dataspace Selection.</a></p>
</p>
<p>This field exists if the <em>Reference Type</em> is H5R_DATASET_REGION2.</p>
</td>
</tr>

<tr>
  <td><p>Length of Attribute Name</p></td>
  <td><p>This is the length of the attribute name.
	<p>This field exists if the <em>Reference Type</em> is H5R_ATTRIBUTE.</p>
  </td>
</tr>

<tr>
  <td><p>Attribute Name</p></td>
  <td><p>This is the name of the attribute being referenced.
	<p>This field exists if the <em>Reference Type</em> is H5R_ATTRIBUTE.</p>
  </td>
</tr>

</table>
</div>

<br />
<br />
<br />


<a name="ReferenceEncodeDP">
  <h3>VIII.C. Reference Encoding (Backward Compatibility)</h3></a>
<p>
  <br />
  The two references described below are maintained to preserve compatibility with previous versions of the library.
<p>
  For the following reference type,
  the reference encoding is stored as the dataset's raw data in the file:
  <ul>
    <li>Object Reference (H5R_OBJECT1)</li>
  </ul>
<p>
  For the following reference type,
  the <a href="#GlobalHeapID">Global Heap ID</a> is stored as the dataset's raw data in the file.
  The global heap ID is used to locate the reference encoding
  stored in the global heap:
  <ul>
    <li>Dataset Region Reference (H5R_DATASET_REGION1)</li>
  </ul>

  <br />
  <br />
  <div align="center">
    <table class="format">
      <caption>
        Layout: Reference for H5R_OBJECT1
      </caption>

	  <tr>
	    <th width="25%">byte</th>
	    <th width="25%">byte</th>
	    <th width="25%">byte</th>
	    <th width="25%">byte</th>
	  </tr>

      <tr>
        <td colspan="4"><br />Object Address<sup>O</sup><br /><br /></td>
      </tr>

    </table>

    <table class="note">
      <tr>
        <td width="60%">&nbsp;</td>
        <td width="40%">
          (Items marked with an &lsquo;O&rsquo; in the above table are
          of the size specified in the <a href="#SizeOfOffsetsV0">Size
            of Offsets</a> field in the superblock.)
      </td></tr>
    </table>

  </div>

  <br />
  <br />
  <div align="center">
    <table class="desc">
      <caption>
        Fields: Reference for H5R_OBJECT1
      </caption>
	  <tr>
        <th width="30%">Field Name</th>
        <th>Description</th>
	  </tr>

	  <tr>
	    <td><p>Object Address</p></td>
	    <td>
          <p>Address of the object being referenced
	    </td>
	  </tr>

    </table>
  </div>

  <br />
  <br />
  <br />

  <div align="center">
    <table class="format">
      <caption>
        Layout: Reference for H5R_DATASET_REGION1
      </caption>

	  <tr>
	    <th width="25%">byte</th>
	    <th width="25%">byte</th>
	    <th width="25%">byte</th>
	    <th width="25%">byte</th>
	  </tr>

      <tr>
        <td colspan="4"><br />Object Address<sup>O</sup><br /><br /></td>
      </tr>
	  <tr>
	    <td colspan=4><br /><br />Dataspace Selection Information
          <em>(variable size)</em><br /><br /> <br /></td>
</td>
</tr>

</table>

<table class="note">
  <tr>
    <td width="60%">&nbsp;</td>
    <td width="40%">
      (Items marked with an &lsquo;O&rsquo; in the above table are
      of the size specified in the <a href="#SizeOfOffsetsV0">Size
        of Offsets</a> field in the superblock.)
  </td></tr>
</table>

</div>

<br />
<br />
<div align="center">
  <table class="desc">
    <caption>
      Fields: Reference for H5R_DATASET_REGION1
    </caption>
	<tr>
      <th width="30%">Field Name</th>
      <th>Description</th>
	</tr>

	<tr>
	  <td><p>Object Address</p></td>
	  <td><p>This is the address of the object being referenced.
	  </td>
	</tr>

	<tr>
	  <td><p>Dataspace Selection Information</p></td>
	  <td><p>This is the dataspace selection for the object being referenced.
          See <a href="#DataspaceSEL">Dataspace Selection.</a></p>
</p>
</td>
</tr>

</table>
</div>

<br />
<br />
<br />


</body>
</html>
